QT Day01 qt概述,创建项目,窗口属性,按钮,信号与槽

news2024/11/27 12:24:50

1.qt概述

1.什么是qt

        Qt 是一个跨平台的 C++ 图形用户界面应用程序框架。它为应用程序开发者提供建立艺
术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组
件编程。

2.支持的平台

Windows – XP Vista Win7 Win8 Win2008 Win10
Uinux/X11 – Linux Sun Solaris HP-UX Compaq Tru64 UNIX IBM AIX
SGI IRIX FreeBSD BSD/OS 、和其他很多 X11 平台
Macintosh – Mac OS X
Embedded – 有帧缓冲支持的嵌入式 Linux 平台, Windows CE
3.安装
        见之前博客

2.创建项目

创建项目

步骤一:选择新建

步骤二:选择application项目

3.填写项目名称和存储路径位置

如图所示

3.工程.pro文件说明

# 添加源信息: core 核心源码, gui 图形化源码
QT + = core gui
# 如果 Qt 版本大于 4, QT 添加 widgets 组件库
greaterThan(QT_MAJOR_VERSION, 4) : QT + = widgets
# 生成的 .exe 文件名
TARGET = demo01
# 模板类型 ,app 表示应用程序模板
TEMPLATE = app
# 使用 c++11 标准
# g++ -std=c++11
CONFIG + = c++11
# Qt 过时警告
DEFINES + = QT_DEPRECATED_WARNINGS
# cpp 的源文件 【重要】
SOURCES + = \
main.cpp \
widget.cpp
# 头文件 【重要】
HEADERS + = \
widget.h
# 编译时输出的可执行程序的名称
TARGET = hello
# 部署安装时的选项, qnx 是嵌入式的操作系统的名称
qnx : target.path = /tmp/$${TARGET}/bin
# 如果不是 qnx ,是 unix Android , 安装的目标位置是 /opt/../bin
else : unix : !android : target.path = /opt/$${TARGET}/bin
# 如果 target.path 路径非空时,则设置安装路径
!isEmpty(target.path): INSTALLS += target

4.窗口属性

this->resize(800,600);  //设置窗口大小( 1 : 宽度, 2 : 高度)
this->setWindowTitle(" 德玛西亚"); // 设置窗口标题
this->setFixedSize(800,600);// 设置窗口大小不可改变
this->setWindowicon(Qicon("图片文件路径"));//设置窗口图标
this->setText("");//设置文本信息
this->Text();//获取文本信息

5.按钮Qpushbutton

方式一:代码创建

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>//1,引入按钮所需头文件
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
    ui->setupUi(this);
    //设置窗口大小
    //1参:宽度
    //2参:高度
    this->resize(800,600);
    //设置窗口标题
    this->setWindowTitle("德玛西亚");
    //设置窗口大小不可改变
    this->setFixedSize(800,600);
    //2,创建按钮对象
    QPushButton* btn = new QPushButton;
    //3,设置按钮的父容器
    btn->setParent(this);
    //4,设置位置
    btn->move(100,100);
    //5,设置文本
    btn->setText("登录");
    }
Widget::~Widget()
{
    delete ui;
}
方式 2: 图形界面开发

6.信号与槽机制

1.注意

        核心在于发送者与接受者
        发送者可以发出多种信号, 被多个不同的接收者接收
        接收者有多个槽函数, 接收不同的发送者发出的信号

2.信号与槽的连接

connect()函数
        connect(sender, signal, receiver, slot)
        sender:发送者
        signal:发出的信号
        receiver:接受者
        slot:槽函数
        示例1
        //ui文件中名为 btnclose 的按钮发出点击信号
        //被当前窗口接收,执行关闭窗口的操作
        //qt5的写法
        //connect(ui->btnclose,&QPushButton::clicked,this,&Widget::close);
        //qt4的写法
        connect(ui->btnclose,SIGNAL(clicked(bool)),this,SLOT(close()));
        示例2
        //信号与槽函数有参数
        //qt5的写法
        //void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;
        //void (Widget:: *myfun_p)(bool) = &Widget::myfun;
        //connect(ui->btnclose,cli_p,this,myfun_p);
        //qt4的写法
        connect(ui->btnclose,SIGNAL(clicked(bool)),this,SLOT(myfun(bool)));

系统提供的信号与槽

QWidget 提供
信号:
void customContextMenuRequested(const QPoint &pos) // 请求上下文菜单时
void windowIconChanged(const QIcon &icon) // 窗口图标改变时
void windowTitleChanged(const QString &title) // 窗口标题改变时
槽:
bool close() // 关闭
void hide() // 隐藏
void lower()
void raise()
void repaint() // 重新加载
void setDisabled(bool disable)
void setEnabled(bool)
void setFocus()
void setHidden(bool hidden)
void setStyleSheet(const QString &styleSheet)
virtual void setVisible(bool visible)
void setWindowModified(bool)
void setWindowTitle(const QString &)
void show() // 显示
void showFullScreen() // 全屏显示
void showMaximized() // 最大化显示
void showMinimized() // 最小化显示
void showNormal()
void update()
QPushButton 提供
信号:
void clicked(bool checked = false) // 点击信号
void pressed() // 按钮按下信号 (按下)
void released() // 按钮释放信号(抬起)
void toggled(bool checked) // 触发(开或关)

自定义信号与槽

注意事项:

1, 发送者和接收者都需要是 QObject 的子类(当然,槽函数是全局函数、 Lambda 表达
式等无需接收者的时候除外)
2, 信号和槽函数返回值类型是 void
3, 信号只需要声明 , 不需要实现
4, 槽函数需要声明也需要实现
5, 槽函数是普通的成员函数,作为成员函数,会受到 public private protected
的影响;
6, 使用 emit 在恰当的位置发送信号 ;
7, 使用 connect() 函数连接信号和槽。
8, 任何成员函数、 static 函数、全局函数和 Lambda 表达式都可以作为槽函数
9, 信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。
10, 如果信号和槽的参数不一致,允许的情况是,槽函数的参数可以比信号的少,即便
如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。这是因为,你
可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少)。
案例 : 下课了 , 老师饿了 , 学生请吃饭

信号槽拓展

1,一个信号可以和多个槽相连
        槽会一个接一个的被调用,但是它们的调用顺序是不确定
示例:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPushButton* btn = new QPushButton(this);
    btn->setText("按钮");
    void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;
    connect(btn,cli_p,this,&MainWindow::fun01);
    connect(btn,cli_p,this,&MainWindow::fun02);
    connect(btn,cli_p,this,&MainWindow::fun03);
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::fun01()
{
    qDebug() << "fun0111111" << endl;
}
void MainWindow::fun02()
{
    qDebug() << "fun0222222" << endl;
}
void MainWindow::fun03()
{
    qDebug() << "fun0333333" << endl;
}
2,多个信号可以连接到一个槽
        只要任意一个信号发出,这个槽就会被调用
示例:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPushButton* btn1 = new QPushButton(this);
    btn1->setText("按钮1");
    QPushButton* btn2 = new QPushButton(this);
    btn2->setText("按钮2");
    btn2->move(0,50);
    void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;
    connect(btn1,cli_p,this,&MainWindow::fun01);
    connect(btn2,cli_p,this,&MainWindow::fun01);
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::fun01()
{
    qDebug() << "fun0111111" << endl;
}
3,一个信号可以连接到另外的一个信号
        当第一个信号发出时,第二个信号被发出。除此之外,这种信号- 信号的形式和信号 -
的形式没有什么区别。
示例:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPushButton* btn = new QPushButton(this);
    btn->setText("按钮");
    void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;
    connect(btn,cli_p,this,&MainWindow::mySignal);
    connect(this,&MainWindow::mySignal,this,&MainWindow::fun01);
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::fun01()
{
    qDebug() << "fun0111111" << endl;
}
4,信号槽可以断开
        利用 disconnect 关键字是可以断开信号槽的
示例:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPushButton* btn = new QPushButton(this);
    btn->setText("按钮");
    void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;
    connect(btn,cli_p,this,&MainWindow::fun01);
    //断开信号与槽的连接
    btn->disconnect(this);
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::fun01()
{
    qDebug() << "fun0111111" << endl;
}
5,槽可以被取消链接
        这种情况并不经常出现,因为当一个对象 delete 之后, Qt 自动取消所有连接到这个
对象上面的槽
6.使用lambda表达式
        在使用 Qt 5 的时候,能够支持 Qt 5 的编译器都是支持 Lambda 表达式的。

Lambda表达式

c++11 提出 lambda 表达式
作用 : 简化代码
语法:
[ 函数对象参数 ]( 操作符重载函数参数 ) mutable -> 返回值 { 函数体 }
        []:lambda表达式符号 , 可以啥都不写 , 不能省略
        函数对象参数
                空 没有使用任何函数对象参数
                = 可以访问外部变量只能读
                a,b 能对lambda 外的 a,b 变量读操作
                & lambda外的变量读写操作
                a,&b 对外部的a b 读写
                this 函数体内可以使用 Lambda 所在类中的成员变量
(): 形参列表

示例1:不使用外部变量

connect(btn03,&QPushButton::clicked,[](){
qDebug()<< " , 不闹 " << endl;
});

示例2.使用外部指定变量

int x=100;
connect(btn2, &QPushButton::clicked, [x]() mutable{
// x 在函数内部是 const 修饰的,除非去掉 const ,加 mutable 关键字
x++;
qDebug() << x << endl;
});

示例3:同时传递多个变量或变量的引用

int x=100;
int y=90;
connect(btn2, &QPushButton::clicked, [x, &y]() mutable{
// x 在函数内部是 const 修饰的,除非去掉 const ,加 mutable 关键字
x++;
qDebug() << x <<","<< y << endl;
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1259507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础编程入门视频教程,零基础编程从哪学起,分享中文编程工具构件实例

零基础编程入门视频教程&#xff0c;零基础编程从哪学起&#xff0c;分享中文编程工具构件实例 1、零基础编程入门视频教程&#xff0c;系统化编程教程链接 https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 2、零基础编程从哪学起 建议初学…

C语言:求Sn=a+aa+aaa+aaaa+……(n个a)之值,其中a表示一个数字,n表示a的位数,n由键盘录入。

分析&#xff1a; 在主函数 main 中&#xff0c;程序首先定义四个整型变量 a、n、i 和 sn&#xff0c;并初始化 a、n 和 i 的值&#xff0c;其中 sn 用于记录数列的和。然后使用 scanf 函数从标准输入中读取用户输入的两个整数 a 和 n。 接下来&#xff0c;程序通过 while …

【JavaScript框架】2024年需要学习的顶级JavaScript框架:Blitz、SolidJS、Svelte等

如今&#xff0c;Web开发人员面临两大问题。 第一个是如何自动化繁琐的web开发工作。要为标准web应用程序设置一个项目&#xff0c;您必须花费宝贵的时间学习用于常见任务的几个库&#xff0c;如身份验证和数据库处理&#xff0c;并将它们捆绑在一起。第二个问题是如何使网络应…

knife4j集合化postman

knife4j集合化postman 01 knife4j的介绍 基于 JavaMVC的集成框架swagger的进一步强化&#xff0c;在原有通过注释就能生成文档的前身swagger-bootstrap-ui之上&#xff0c;增加了postman的测试功能&#xff0c;优化了文档的UI界面&#xff0c;在测试api接口的方面有了极大的进…

C语言错误处理之<errno.h>与<error.h>

目录 前言 错误号处理方式 errno.h头文件 常见的宏 error.h头文件 参数解释&#xff1a; 关于的”__attribute__“解释&#xff1a; 关于“属性”的解释&#xff1a; 实例一&#xff1a; 实例二&#xff1a; error.h与errno.h的区别 补充内容&#xff1a; 前言 …

TUP通信——与多个客户端同时通信

一&#xff0c;概括&#xff1a;可以通过多线程思想每加一个客户端由线程池中的主线程交给一个子线程管理 二&#xff0c;案例 &#xff08;1&#xff09;&#xff0c;线程池 &#xff08;2&#xff09;&#xff0c;服务端 &#xff08;3&#xff09;&#xff0c;客户端

RPG项目01_UI登录

首先创建一个项目 将资源包导进Resources文件夹 创建一个Scripts脚本文件夹 然后再对Scripts脚本文件夹分门别类 导入UI资源包 创建一个Image 按住Alt 选择右下角 image就会覆盖整个面板 修改image名字为BG 将image图片放置背景栏 再创建一个image 改名为MainMenu 修改MainMenu…

FLV 文件格式分析

前言 flv 是 flash video 的缩写&#xff0c;是 Adobe Flash payler 支持的一种流媒体播放格式。flv 是一种层级格式&#xff0c;除了一个 flv header 外&#xff0c;剩下全是由 一个个 tag 组成。tag 是由 tag 头和 tag 数据组成。tag 类型分为音频、视频、脚本&#xff0c;一…

centos7 keepalived 探测当前节点

前提 nginx 默认页面内容中需要加上各节点的ip nginx web页面修改 nginx配置文件路径&#xff1a;/etc/nginx/nginx.conf&#xff0c;该配置文件引用了/etc/nginx/conf.d/default.conf 打开/etc/nginx/conf.d/default.conf配置文件可以看到html页面的路径 /usr/share/nginx…

分享从零开始学习网络设备配置--任务4.3 使用动态路由RIPng实现网络连通

任务描述 某公司使用IPv6技术搭建企业网络&#xff0c;由于静态路由需要管理员手工配置&#xff0c;在网络拓扑发生变化时&#xff0c;也不会自动生成新的路由&#xff0c;因此采用IPv6动态路由协议RIPng实现网络连通&#xff0c;实现任意两个节点之间的通信&#xff0c;并降低…

【UE】切割程序化网格体

效果 步骤 1. 新建一个Actor蓝图&#xff0c;这里命名为“BP_程序化网格体” 打开“BP_程序化网格体”&#xff0c;添加一个静态网格体组件&#xff0c;再添加一个程序化网格体组件 选中程序化网格体组件&#xff0c;取消勾选“将复杂性用作简单碰撞”选项 选中静态网格体组件…

详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)

目录 一.什么是泛型 二.Java中为什么要使用泛型 三.泛型的语法 四.泛型类的使用 五.泛型的编译机制&#xff08;擦除机制&#xff09; 六.泛型的上界 一.什么是泛型 泛型&#xff08;Generics&#xff09;是Java SE 5中引入的一个新特性&#xff0c;可以使Java中的类和方…

这些steam游戏搬砖知识,你不会还不知道吧?

CSGO搬砖日常出货更新 大家好&#xff0c;我是阿阳&#xff0c;一个只讲项目实操干货的创业博主。今天的内容主要是针对准备踏入游戏行业的新人来讲的&#xff1a; 1、首先大家一定要弄清游戏搬砖到底是哪一个游戏搬砖&#xff0c;因为市面上有个叫游戏打金的很多人也习惯把他…

Liunx系统使用超详细(二)

本篇内容是总结罗列Liunx系统日常使用的基础操作&#xff01;&#xff01;&#xff01; 目录 一、查看IP地址 1.1使用 ip 命令 1.2使用 ifconfig 命令 1.3使用hostname命令&#xff08;仅显示主机名&#xff09; 1.4使用curl命令获取公共IP地址 二、重启网卡(网络接口) …

实在智能荣获36氪消费新势力榜单“优选品牌服务商”

近日&#xff0c;36氪未来消费正式公布「FUTURE 2023」消费新势力名单&#xff0c;实在智能凭借专业的数字化产品力、卓越的服务力和深远的行业影响力&#xff0c;成功入选榜单并获评“优选品牌服务商”。 据悉&#xff0c;此次名单是由36氪未来消费特邀消费领域的行业专家、投…

开源运维监控系统-Nightingale(-夜莺)应用实践(未完)

一、前言 某业务系统因OS改造,原先的Zabbix监控系统推倒后未重建,本来计划用外部企业内其他监控系统接入,后又通知需要自建才能对接,考虑之前zabbix的一些不便,本次计划采用一个类Prometheus的监控系统,镜调研后发现Nightingale兼容Prometheus,又有一些其他功能增强,又…

【微服务】java 规则引擎使用详解

目录 一、什么是规则引擎 1.1 规则引擎概述 1.2 规则引擎执行过程 二、为什么要使用规则引擎 2.1 使用规则引擎的好处 2.1.1 易于维护和更新 2.1.2 增强应用程序的准确性和效率 2.1.3 加快应用程序的开发和部署 2.1.4 支持可视化和可管理性 2.2 规则引擎使用场景 三、…

Python实现FA萤火虫优化算法优化循环神经网络分类模型(LSTM分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

CNN对 MNIST 数据库中的图像进行分类

加载 MNIST 数据库 MNIST 是机器学习领域最著名的数据集之一。 它有 70,000 张手写数字图像 - 下载非常简单 - 图像尺寸为 28x28 - 灰度图 from keras.datasets import mnist# 使用 Keras 导入MNIST 数据库 (X_train, y_train), (X_test, y_test) mnist.load_data()print(&…