Qt_信号与槽高级用法
1. 信号、槽和普通函数的执行顺序
1.1 发出信号后,是否会立即执行后面的函数
-
函数和槽的执行顺序是什么?
答:信号发出之后,首先执行的是槽函数,然后执行普通函数renameFile() -
总结:单线程的前提下,发出信号后,先执行槽函数,再执行普通函数
1.2 若信号与多个槽同时连接,槽函数执行顺序?
-
槽函数的执行顺序?
答:按顺序依次进行执行 -
总结:按照
connect
连接的顺序执行
1.3 多个槽函数与普通函数的执行顺序?
-
当一个信号连接了多个槽函数,并且后面还有普通函数,执行顺序是什么?
答: 槽函数依次按顺序进行执行,最后执行普通函数 -
总结: 符合第一条和第二条的规律
1.4 原理
信号槽只是在代码编写形式上进行了分离,而实质上仍然按顺序调用函数。
其实进行emit
后,代码是被整合成了这个形式。
1.5 总结
-
当信号发出之后,先执行槽函数
-
如果槽函数有多个,则按照绑定顺序执行
-
槽函数执行结束,执行普通函数
2. 获取信号的发出者
2.1 获取被点击按钮相关信息
-
使用
sender()
获取
-
获取信号发出者及文本
QPushhButton* btn = dynamic_cast<QPushButton*>(sender());
3. 断开连接
3.1 disconnect
结构:(发送者,发送者对应的信号,接收者,接收者槽函数)
3.2 断开所有连接
例子:
disconnect(ui->spinBox,nullptr,nullptr,nullptr);
或
ui -> spinBox -> disconnect(nullptr,nullptr,nullptr);
3.3 断开valueChange(QString)关联信号的所有连接
disconnect(ui->spinBox,SIGNAL(valueChange(QString)),nullptr,nullptr);
3.4 断开接收者所有的连接
disconnect(ui->spinBox,nullptr,ui->progressBar,nullptr);
3.5 断开接收者槽函数的连接
disconnect(ui->spinBox,nullptr,ui->progressBar,SLOT(setWindowTitle(QString));
3.6 总结
- singal / receiver / method 都可以设置为nullptr
- obj -> disconnect
- QObject::disconnect
4.QSingalMapper用法
为了防止建立过多的信号和槽,使代码杂乱无章,因此可以使用QSingalMapper的方法进行统一的管理