环境:Qt Creator 4.11.1
信号和槽
信号和槽是Qt中特有的消息传输机制:用户与窗口中的控件进行交互时,对应的窗口会针对特定的事件发出对应的信号。如果信号和槽进行了关联,槽就会对所关联的信号做出响应动作。
Q_OBJECT:在Qt中如果要让某个类能够使用信号槽,就必须在类最开始的地方写下这个宏
关联信号和槽
关联信号和槽我们需要使用QObject类中的静态成员函数connect
注意下面的connect只是其中一个重载版本,只用做说明。详情还请查看文档
QMetaObject::Connection QObject::connect(
const QObject *sender, //谁发送了信号
PointerToMemberFunction signal, //发送了什么信号
const QObject *receiver, //谁接收了信号
PointerToMemberFunction method, //怎么处理
Qt::ConnectionType type = Qt::AutoConnection)//关联类型,通常不需要设定
例: 点击按钮关闭窗口, 下面我们使用可视化生成槽
上述操作中。用户点击了按钮,按钮发出了“按钮被点击了”(clickde)的信号。clicked信号与on_pushButton_clicked槽关联。槽做出了“窗口关闭”的响应动作。
信号和事件
信号是由事件产生的,事件是用户与控件的交互过程。用户点击按钮就是一次事件,每一次事件都会发出一次信号,之后信号:“按钮被点击了”被发送。信号的本质就是事件。
槽
槽是对信号的响应函数,其本质是一个回调函数。信号在发送时会自动执行关联的槽函数。
小细节
自定义信号和槽
基本语法
信号函数
信号可以用函数表示,称为信号函数。
1)信号函数必须写在“signals”下;
2)信号函数返回值为void,只需声明,无需定义。(信号函数的定义是 Qt ⾃动在编译程序之前生成的。这种自动生成代码的机制称为元编程(Meta programming));
3)可以有参数,也可以有重载;
槽函数
1)槽函数用public/private/protected slots修饰。高级版本的Qt允许写到public/private/protected作用域中或者全局下;
2)槽函数需要声明和定义,返回值为void;
3)可以具有任何参数,可以被重载,但是不能有默认参数;
4)槽函数的参数不能多于关联的信号函数,只能小于或等于,否则程序就会报错。推荐槽函数和信号函数参数保持一致。
使⽤ “emit” 关键字发送信号 。事实上"emit" 是⼀个空的宏。“emit” 其实是可选的,没有什么含义,直接使用MySignal(), 同样也能发送信号。 这样是为了提醒开发⼈员这是一个信号函数。
信号函数和槽函数重载
不喜欢用指针的同学也可以使用Qt4的信号和槽的关联方式
注意:Qt4的关联方式虽然参数直观。但是参数类型不会做检测;
补充
我们发现在由Qt自动生成槽函数时,槽函数名为on_pushButton_clicked。这种命名方式是有规则的。自动生成的槽函数名的命名规则为 on_对象名(控件的objectName属性)_信号。按照这种方式命名的槽函数,就会被Qt自动的和对应信号进行链接,这种连接方式称为隐式连接。即使不使用connect显示连接程序也可正常运行。
它的秘密就藏在ui文件生成的头文件ui_widget.h中