当前位置:网站首页>【QT小记】QT中信号和槽的基本使用
【QT小记】QT中信号和槽的基本使用
2022-08-04 01:01:00 【林柒Sevenlin】
QObject::connect
QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal,
const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
sender: 信号发送者
signal: 信号
receiver: 信号接收者
mrthod: 槽函数
type: 连接类型
自定义信号
- 使用宏signals
signals:
// 未带参数
void signal_doSomething1();
// 带参数
void signal_doSomething2(int value);
// 带自定义参数
void signal_doSomething3(const Person &person);
槽函数
- 使用宏slots
- 正常的函数也可以作为槽函数使用(QT5之后)
public slots:
void slot_doSomething1();
void slot_doSomething2(int value);
void slot_doSomething3(const Person &person);
信号槽连接
// QT4写法
connect(this, SIGNAL(signal_doSomething1()), this, SLOT(slot_doSomething1()));
connect(this, SIGNAL(signal_doSomething2(int)), this, SLOT(slot_doSomething2(int)));
connect(this, SIGNAL(signal_doSomething3(const Person &)), this, SLOT(slot_doSomething3(const Person &)));
// QT5写法
connect(this, &Widget::signal_doSomething1, this, &Widget::slot_doSomething1);
connect(this, &Widget::signal_doSomething2, this, &Widget::slot_doSomething2);
connect(this, &Widget::signal_doSomething3, this, &Widget::slot_doSomething3);
// 使用lambda表达式
connect(this, &Widget::signal_doSomething1, [=] {
slot_doSomething1();
});
connect(this, &Widget::signal_doSomething2, [=](int value) {
slot_doSomething2(value);
});
自定义参数跨线程使用
- 非QT数据类型在跨线程信号槽使用时需先注册数据类型
- 在同一线程使用则无需注册数据类型
#include <QMetaType>
qRegisterMetaType<Person>("Person");
信号和槽重载
- 使用QT4的写法则没有信号和槽重载的问题
- 使用QT5的写法则会报错,需使用 QOverload<T>::of 进行改写
signals:
// 信号重载
void signal_doWork();
void signal_doWork(int value);
public slots:
// 槽函数重载
void slot_doWork();
void slot_doWork(int value);
// 信号槽连接
// QT4写法
connect(this, SIGNAL(signal_doWork()), this, SLOT(slot_doWork()));
connect(this, SIGNAL(signal_doWork(int)), this, SLOT(slot_doWork(int)));
// QT5写法
connect(this, QOverload<>::of(&Widget::signal_doWork), this, QOverload<>::of(&Widget::slot_doWork));
connect(this, QOverload<int>::of(&Widget::signal_doWork), this, QOverload<int>::of(&Widget::slot_doWork));
第五个参数Qt::ConnectionType
- 一般第五个参数都不用写,使用默认值Qt::AutoConnection
类型 | 描述 |
---|---|
Qt::AutoConnection | (默认值)如果接收者位于发出信号的线程中,则使用Qt::DirectConnection。否则,使用Qt::QueuedConnection。在发出信号时确定连接类型。 |
Qt::DirectConnection | 当信号发出时,槽函数将立即被调用。槽在信号线程中执行。 |
Qt::QueuedConnection | 当控制返回到接收线程的事件循环时,将调用槽。槽在接收者的线程中执行。 |
Qt::BlockingQueuedConnection | 与Qt::QueuedConnection相同,不同的是信号线程阻塞直到槽返回。如果接收方位于发出信号的线程中,则不能使用此连接,否则应用程序将死锁。 |
Qt::UniqueConnection | 这是一个可以使用位或与上面任何一种连接类型组合的标志。当Qt::UniqueConnection被设置时,如果连接已经存在,QObject::connect()将会失败(例如,如果相同的信号已经连接到同一对对象的同一槽函数)。该标志是在Qt 4.6中引入的。 |
解除连接
- disconnect
解除具体的一个信号与槽之间的连接
QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
- blockSignals
阻塞一对象发出的所有信号
QObject::blockSignals(bool block)
边栏推荐
猜你喜欢
随机推荐
建木DevOps流程的快速运用
如何用C语言代码实现商品管理系统开发
.NET Static Code Weaving - Rougamo Release 1.1.0
typescript50 - type specification between cross types and interfaces
NLP resources that must be used for projects [Classified Edition]
优秀的测试/开发程序员,是怎样修炼的?步步为营地去执行......
Vant3—— 点击对应的name名称跳转到下一页对应的tab栏的name的位置
typescript58 - generic classes
jmeter distributed stress test
R3LIVE论文学习(二):VIO子系统
LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之三:两次优化
Web3 安全风险令人生畏?应该如何应对?
敏捷交付的工程效能治理
特征值与特征向量
快速入门EasyX图形编程
2015年开源大事件汇总
教你如何定位不合理的SQL?并优化之
Apache DolphinScheduler新一代分布式工作流任务调度平台实战-中
高斯推断推导
js函数防抖和函数节流及其使用场景