当前位置:网站首页>【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)
边栏推荐
- 【超详细教程】LVS+KeepAlived高可用部署实战应用
- 贴纸拼词 —— 记忆化搜索 / 状压DP
- .NET Static Code Weaving - Rougamo Release 1.1.0
- MATLAB三维绘图命令plot3入门
- 一文参透分布式存储系统Ceph的架构设计、集群搭建(手把手)
- LeetCode third topic (the Longest Substring Without Repeating Characters) trilogy # 3: two optimization
- typescript57-数组泛型接口
- 手撕Gateway源码,今日撕工作流程、负载均衡源码
- nodejs切换版本使用(不需要卸载重装)
- Spinnaker调用Jenkins API 返回403错误
猜你喜欢
随机推荐
ES6高级-迭代器与生成器的用法
typescript52-简化泛型函数调用
typescript56 - generic interface
FeatureNotFound( bs4.FeatureNotFound: Couldn‘t find a tree builder with the features you requested:
建木DevOps流程的快速运用
Nanoprobes Alexa Fluor 488 FluoroNanogold 偶联物
LeetCode third topic (the Longest Substring Without Repeating Characters) trilogy # 3: two optimization
谁说程序员不懂浪漫,表白代码来啦~
哎,又跟HR在小群吵了一架!
VR全景拍摄线上展馆,3D全景带你沉浸体验
【面经】被虐了之后,我翻烂了equals源码,总结如下
pcl点云数据 转化为 Eigen::Map
MongoDB数据接入实践
C # WPF equipment monitoring software (classic) - the next
全面讲解 Handler机制原理解析 (小白必看)
MATLAB三维绘图命令plot3入门
nodejs+npm的安装与配置
越来越火的图数据库到底能做什么?
特征值与特征向量
nodejs安装及环境配置