文章目录
- 一、概念
- (一)Qt工具
- 1. Assistant:帮助手册
- 2. Designer:Qt设计师
- 3. xxx.uic文件
- 4. rcc资源文件
- 5. moc:元对象编译器
- 6. qmake
- 7. Qtcreator:集成化的开发软件
- (二)创建第一个Qt程序
- 1. 参考文档
- 2. 影子构建
- 3. xxx.pro
- 4. main.cpp
- 5. xxx.h
- 6. xxx.cpp
- (三)工程文件说明
- (四)Qt标准类
- 二、 信号和槽机制
- (一)使用
- 1. 设计界面
- 2. 使用提供的信号函数和槽函数
- (1)
- (2)通过函数实现
- (二)自定义信号和槽
- 1. 自定义信号和槽
- 2. 使用示例
- (三)信号函数与槽函数总结
一、概念
Qt是一个跨平台的基于C++图形用户界面应用程序开发框架
(一)Qt工具
1. Assistant:帮助手册
2. Designer:Qt设计师
通过设计师生成的文件的后缀名为xxx.ui
3. xxx.uic文件
将ui界面编译成C++的文件格式
4. rcc资源文件
5. moc:元对象编译器
信号和槽
6. qmake
xxx.pro文件生成
7. Qtcreator:集成化的开发软件
(二)创建第一个Qt程序
1. 参考文档
2. 影子构建
3. xxx.pro
4. main.cpp
5. xxx.h
6. xxx.cpp
(三)工程文件说明
(四)Qt标准类
QObject:这是Qt中所有对象的基类。Qt中的很多类都继承自QObject,以利用Qt的信号与槽机制、对象树和属性系统等特性。
QWidget:它是Qt中所有用户界面对象的基类。QWidget提供了用户界面的基本功能,如大小、位置、字体和样式等。QWidget继承自QObject,因此它可以使用Qt的信号与槽机制等特性。
QFrame:它是QWidget的一个子类,专门用于提供一个带有边框和可选背景的框架。QFrame继承了QWidget的所有功能,并增加了边框和背景相关的属性。
二、 信号和槽机制
信号和槽机制是一种手段,是一种通信机制,发生子两个组件或者两个组件以上的通信;
信号和槽本质上就是函数,因此可以称为信号函数和槽函数
可以使用提供的信号函数和槽函数,也可以使用自定义的信号函数和槽函数
提供的信号函数通过‘转到槽’进行选择即可,但是提供的槽函数需要自定义;
(一)使用
信号/槽机制在QObject类中实现
QWidget 是Qt中所有用户界面对象的基类,它本身继承自 QObject 类。而 QObject 类是Qt对象模型的核心,它提供了对象树、事件处理、属性系统、对象间通信(包括信号和槽)等核心功能
1. 设计界面
- 需求:有两个按钮,一个按钮负责关闭label控件,另一个负责关闭父窗口
- 将需要的组件拖到工作区
- 修改要修改的组件属性:
修改组件objectName、文本、字体和大小
修改父窗口大小
修改标题windowTitle - 布局(美观)
2. 使用提供的信号函数和槽函数
(1)
第一步:设计界面下方
第二步:添加信号和槽
(2)通过函数实现
(二)自定义信号和槽
1. 自定义信号和槽
-
自定义信号函数
自定义的信号函数只有声明,没有定义
emit 自定义的信号函数 -
自定义槽函数
自定义的槽函数既要声明也要定义
返回值类型
- 用于信号函数和槽函数连接:connect
- 用于信号函数和槽函数断开:disconnect
[static]
2. 使用示例
- 注:
(三)信号函数与槽函数总结
1.信号函数和槽函数的形参类型和个数要求一致(使用比较多)
QObject::connect(发送者,SIGNAL(on_custom_signals()),接收者,SLOT(on_custom_slot())); //ok
QObject::connect(发送者,SIGNAL(on_custom_signals(int)),接收者,SLOT(on_custom_slot(int))); //ok
QObject::connect(发送者,SIGNAL(on_custom_signals(int,char)),接收者,SLOT(on_custom_slot(int,char))); //ok
QObject::connect(发送者,SIGNAL(on_custom_signals(int,char)),接收者,SLOT(on_custom_slot(char,char))); //error
2.信号函数的参数个数可以比槽函数的形参个数多(使用比较少)
QObject::connect(发送者,SIGNAL(on_custom_signals(int,int)),接收者,SLOT(on_custom_slot(int))); //ok
QObject::connect(发送者,SIGNAL(on_custom_signals(int)),接收者,SLOT(on_custom_slot(int,int))); //error
3.槽函数的形参个数一般不可以比信号函数多
如果槽函数的形参个数比信号函数的形参个数多,可以给槽函数的形参添加缺省值
QObject::connect(发送者,SIGNAL(on_custom_signals(int)),接收者,SLOT(on_custom_slot(int,int))); //error
//想要上面的连接函数成立的话,必须要给槽函数的形参添加缺省值
QObject::connect(发送者,SIGNAL(on_custom_signals(int)),接收者,SLOT(on_custom_slot(int,int = 缺省值))); //ok
4.一个信号函数可以对应多个槽函数(使用比较多)
QObject::connect(发送者,SIGNAL(on_custom_signals()),接收者,SLOT(on_custom_slot1())); //ok
QObject::connect(发送者,SIGNAL(on_custom_signals()),接收者,SLOT(on_custom_slot2())); //ok
5.多个信号函数可以对应同一个槽函数(使用比较多)
QObject::connect(发送者,SIGNAL(on_custom_signals1()),接收者,SLOT(on_custom_slot())); //ok
QObject::connect(发送者,SIGNAL(on_custom_signals2()),接收者,SLOT(on_custom_slot())); //ok
- 注:
- 当连接信号和槽时,它们的参数列表(包括参数的数量、类型和顺序)必须兼容。槽函数的参数类型必须能够接收信号发送的数据类型,或者信号发送的数据类型可以被隐式转换为槽函数期望的参数类型
- 在Qt框架中,当对象的状态发生变化时,它可以通过发送信号来通知其他可能对此变化感兴趣的对象。发送信号的对象(称为信号的发射者)并不关心是否有其他对象接收(或监听)这个信号,也不关心有多少个对象接收了这个信号。