当前位置:网站首页>【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)
边栏推荐
猜你喜欢
typescript50-交叉类型和接口之间的类型说明
Nanoprobes Alexa Fluor 488 FluoroNanogold 偶联物
Modulo operation (MOD)
建木DevOps流程的快速运用
Electronics manufacturing enterprise deployment WMS what are the benefits of warehouse management system
字符串的排列
Slipper —— 虚点,最短路
教你如何定位不合理的SQL?并优化之
LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之三:两次优化
Web3 安全风险令人生畏?应该如何应对?
随机推荐
Analysis of usage scenarios of mutex, read-write lock, spin lock, and atomic operation instructions xaddl and cmpxchg
手撕Nacos源码,今日撕服务端源码
jmeter distributed stress test
Electronics manufacturing enterprise deployment WMS what are the benefits of warehouse management system
贴纸拼词 —— 记忆化搜索 / 状压DP
Nanoprobes Alexa Fluor 488 FluoroNanogold 偶联物
Slipper —— 虚点,最短路
如何通过API接口从淘宝(或天猫店)复制宝贝到拼多多接口代码对接教程
静态文件快速建站
2022年上半年各大厂Android面试题整理及答案解析(持续更新中......)
Tanabata festival coming, VR panoramic look god assists for you
微服务的简单介绍
特征值与特征向量
TypeScript学习
取模运算(MOD)
【超详细】手把手教你搭建MongoDB集群搭建
卡尔曼滤波器KF
动态内存二
面试必问的HashCode技术内幕
Google Earth Engine ——利用公开的河流数据计算河流的有效宽度