目录
一、概述
1、Qt是什么?
2、Qt的特点
3、Qt版本选择
4、Qt开发工具集
5、Qt Creator集成开发工具
6、项目文件组成
二、项目文件详解
1、项目文件
2、Qt设计师界面
3、Qt属性窗口
三、信号槽
1、信号槽机制概述
2、信号槽自动关联
3、信号槽手动关联
3.1、手动关联的步骤:
3.2、connect的两种写法:
3.3、自定义信号
3.4、信号槽的关系
4 、信号槽注意事项
5、信号槽优缺点
优点:
缺点:
Qt是用C++开发的跨平台应用程序和UI(User Interface)开发框架。使用Qt只需一次开发应用程序,无需重新编写源码,便可跨不同操作系统(windows、linux、mac)部署这些应用程序。此外,Qt还支持不同嵌入式和移动系统,例如:IOS、Android、WinRT等。
Qt前身是创始于1994的Trolltech(奇趣科技),奇趣科技在2008年6被诺基亚收购,2011年3月Qt被芬兰的Digia公司收购,现在最新的版本是6.x
纯C++扩展:用C++语言开发
功能强大:拥有完成的C++图形界面库,集成了OpenGL、多媒体、WebEngine,内置了解析XML和Json的解析器、连接数据库、访问网络、进程间通信、多线程等技术。Qt是应用程序开发的一站式解决方案。
跨平台、几乎支持所有平台
资料丰富、文档齐全
Qt经历了4.x、5.x和6.x,而且还在不断的更新中。Qt用的最多的是Qt5系列,Qt6系列增加了很多新功能,要求操作系统在Win10及以上版本。
Qt4.8.7是Qt4系列的终结版本,也是Qt4中最经典最稳定的版本(很多嵌入式开发还使用此版本)
Qt5.6.3是最后支持xp系统的长期支持版本;
Qt5.12.3是最后提供mysql数据库插件的版本,以后的版本需要自行编译mysql数据库插件;
Qt5.12.5是最后样式表性能最高的版本;
Qt5.14.2是最后提供离线安装包的版本,后面的全部是在线安装;
Qt5.15系列是最后支持win7系统的版本;
Qt6.x与Qt5高度兼容,使用Qt5开发的应用程序可以无缝迁移到Qt6;
https://download.qt.io/archive/qt/
Qt Assistant (Qt助手):帮助文档
Qt Designer(Qt设计师):能够进行UI界面的设计
Qt Linguist(Qt语言家):实现多语言界面,国际化工具
Qt Demos(Qt示例):帮助学习使用
Qt Creator(IDE集成开发工具):Qt 集成开发工具
Qt Widgets Application 桌面界面应用程序,默认提供一个XXX.ui文件;
Qt Console Application 控制台应用程序,无ui文件,一般用于学习Qt/C++基本语法;
Qt for Python Empty/Window 创建一个用python的Qt应用程序;
Qt Quick Application 创建一个Qt Quick应用程序,其界面采用qml语言进行设计,一般用于移动设备或嵌入式设备上进行炫酷界面设计;
firstApp.pro 项目管理文件,使用Qt Creator打开项目时,需要打开此文件
mainwindow.h 是窗体类对应的头文件
mainwindow.cpp是窗体类对应的源文件
mainwindow.ui 窗体类对应的界面文件
main.cpp 主程序文件,里面必须含有一个main()函数,是程序执行的入口
.pro 项目文件
.pro.user 用户配置描述文件,包含Qt相关的本地配置信息,当需要在不同计算机间移动项目源码时,需要将此文件删除
.ui界面文件:本质一个文件文件,可以直接使用notepad++打开
.ui 编译后会生成一个C++类文件,文件名ui_mainwindow.h ,在BuildXXX文件夹中,自动包含源文件中
注意:ui_mainwindow.h文件每次构建项目时都会重新生成该文件,对此文件的修改没有任何意义,所有涉及界面的修改都要在ui设计界面进行。
信号槽用于两个对象之间的通信,是Qt特有的消息传输机制,也是Qt不同于其他开发框架最突出的特征。
信号槽底层是通过函数间的相互调用实现的。每个信号可以用函数表示,称为信号函数;每个槽也可以用函数表示,称为槽函数。
Qt中所有控件都有接收信号的能力,一个控件可以接收多个不同的信号,对接收到的每个信号,控件都可以做出相应的响应动作。控件也有发射信号的能力,例如:按钮QPushButton可以发出clicked信号、pressed信号、releaseed信号
自动关联是将关联关系整合到槽函数的命名中。
例如:on_firstButton_clicked(),on是固定写法,firstButton指的是发出信号的对象(和ui文件中按钮的objectName保持一致),clicked是firstButton发出的信号名称。
接收信号的对象是当前窗体(主题窗体,this),接收信号的对象做的响应动作就在on_firstButton_clicked槽函数中。
使用connect方式进行手动关联
//clicked:信号
//myCloseWindowSlot:定义的方法
//SIGNAL、SLOT是Qt自定义的宏
//Qt4写法
connect(ui->handleButton,SIGNAL(clicked()),this,SLOT(myCloseWindowSlot()));
//Qt5写法
connect(ui->handleButton,&QPushButton::clicked,this,&MainWindow::myCloseWindowSlot);
/*
参数1:发出信号的对象
参数2:发出的信号
参数3:接收信号的对象
参数4:槽函数(接收信号对象的响应动作)
参数5:关联方式,Qt::ConnectionType的取值
*/
Qt::ConnectionType的取值有以下5种:
自动关联:Qt::AutoConnection ,默认值。如果接收者对象和发送者对象处于同一个线程中,则使用Qt::DirectConnection(直接关联),否则使用Qt::QueuedConnection(队列关联);
直接关联:Qt::DirectConnection,发完信号后立即调用槽函数,只有槽函数执行返回后,发送信号后面的代码才会执行;
队列关联:Qt::QueuedConnection,发送信号的对象和接收信号的对象处于不同的线程,当程序执行到接收者所在的线程时再执行槽函数,无论槽函数是否执行完毕,发送信号后面的代码都会立即执行。
阻塞队列关联:Qt::BlockingQueuedConnection,它和队列关联的区别是发送信号的线程会一直阻塞,直到槽函数返回。当发送者对象和接收者对象处于同一线程,使用该关联类型会造成程序死锁。
唯一关联:Qt::UniqueConnection,它可以和上面的关联方式进行按位或操作,使用这个关联类型主要防止信号和槽重复关联。
信号可以使用Qt内置的信号,也可以使用signals关键字自定义信号,自定义信号只需写信号的声明,不能写信号的定义。
使用emit 关键字发射信号,emit关键字可以发射自定义信号,也可以发射Qt内置信号。
//一个信号关联多个槽函数
connect(ui.threeButton, &QPushButton::clicked, this, &dataType01::modifyWindowTitle);
connect(ui.threeButton, &QPushButton::clicked, this, &dataType01::showTipInfo);
//多个信号关联同一个槽函数
connect(ui.fourButton, &QPushButton::pressed, this, &dataType01::showTipInfo);
connect(ui.fourButton, &QPushButton::released, this, &dataType01::showTipInfo);
//信号关联信号:信号发生者是当前窗口对象,信号接收者也是当前窗体对象
connect(this, SIGNAL(myModifySignal(int, QString)), this, SLOT(modifyWindowTitle(int)));
注意:若存在多个槽函数与同一个信号关联,那么当该信号发出时,槽函数会一个接一个执行,执行顺序与关联顺序相同。
详细讲解链接:QT学习日记5——信号连接信号_qt信号连接另一个信号_herb.dr的博客-CSDN博客
发送信号的对象和接收信号的对象所属的类型,都需要继承自QObject或其子类;
在类的声明最开始处必须有Q_OBJECT宏;
槽函数可以是类的成员函数、static函数、全局函数和匿名函数,此时必须采用connect在Qt5中的写法。
当connect使用在Qt4中的写法时,槽函数必须在private/public/protected slots修饰符下面,否槽函数不会执行。
信号只需要声明,不需要定义且返回值必须为void类型
使用emit关键字在合适的位置发送信号;
使用connect方法实现信号和槽的手动关联;
可以使用disconnect方法取消信号和槽的关联;
信号和槽机制是类型安全,相关联的信号和槽的参数类型必须匹配;
信号和槽是松耦合的,信号发送者对象不需要关心接收者对象,接收者对象也不需要关心信号谁发出的;
信号和槽可以使用任意类型任意数量的参数;
信号和槽机制在性能上略低于回调机制,但是由于其高度灵活,性能的损耗在应用程序开发时可以忽略。