QT的信号槽的四种写法和五种链接方式
目录
四种信号槽写法:
五种连接方式:
实例:
常见错误及改正:
错误1: 未连接信号与槽
错误2: 信号和槽参数不匹配
错误3: 未使用Q_OBJECT宏
错误4: 跨线程连接未处理

在Qt中,信号(Signal)和槽(Slot)是一种用于对象之间通信的机制,用于实现一种松耦合的方式。信号被发送时,与之相关联的槽会被调用。以下是四种常见的信号槽写法以及五种连接方式:
四种信号槽写法:
-
直接函数连接:
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));这是Qt早期的连接语法,使用字符串表示信号和槽。在编译时无法进行类型检查。
-
函数指针连接:
QObject::connect(sender, &SenderClass::signal, receiver, &ReceiverClass::slot);这种连接方式在编译时进行了类型检查,但在一些情况下可能不够灵活,比如连接到一个基类的槽。
-
Lambda表达式连接(C++11及以后版本):
QObject::connect(sender, &SenderClass::signal, [=]() { /* slot implementation */ });这种方式可以使用Lambda表达式作为槽的实现,非常方便。
-
Qt5新语法连接:
QObject::connect(sender, &SenderClass::signal, receiver, &ReceiverClass::slot, Qt::ConnectionType);这种语法在Qt5中引入,允许指定连接类型,例如
Qt::AutoConnection、Qt::DirectConnection等。
五种连接方式:
-
AutoConnection:根据信号和槽所在的线程自动选择连接方式。如果在同一线程,则使用
DirectConnection,否则使用QueuedConnection。 -
DirectConnection:信号被发送时,直接调用槽函数。适用于信号和槽在同一线程的情况。
-
QueuedConnection:将信号放入接收者线程的事件队列中,由接收者线程在适当的时候处理。适用于跨线程通信。
-
BlockingQueuedConnection:与
QueuedConnection类似,但发送信号的线程会被阻塞,直到接收者线程处理完信号。 -
UniqueConnection:确保连接是唯一的,防止多次连接同一个信号和槽。如果已经存在相同的连接,新的连接将不会被创建。
实例:
一个简单的Qt应用程序,其中包含一个按钮和一个文本框。当点击按钮时,文本框会显示一条消息。我们将展示如何在这个案例中使用Qt的信号槽机制,涵盖四种写法和五种连接方式。
#include <QtWidgets>class MyWidget : public QWidget {Q_OBJECTpublic:MyWidget(QWidget *parent = nullptr) : QWidget(parent) {QVBoxLayout *layout = new QVBoxLayout(this);button = new QPushButton("Click Me", this);textEdit = new QTextEdit(this);textEdit->setReadOnly(true);layout->addWidget(button);layout->addWidget(textEdit);connectUsingDirectFunction();connectUsingFunctionPointer();connectUsingLambda();connectUsingQt5Syntax();}private slots:void showMessage() {textEdit->append("Button clicked!");}private:QPushButton *button;QTextEdit *textEdit;void connectUsingDirectFunction() {QObject::connect(button, SIGNAL(clicked()), this, SLOT(showMessage()));}void connectUsingFunctionPointer() {QObject::connect(button, &QPushButton::clicked, this, &MyWidget::showMessage);}void connectUsingLambda() {QObject::connect(button, &QPushButton::clicked, [=]() {textEdit->append("Button clicked using lambda!");});}void connectUsingQt5Syntax() {QObject::connect(button, &QPushButton::clicked, this, &MyWidget::showMessage, Qt::AutoConnection);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MyWidget widget;widget.show();return app.exec();
}#include "main.moc"
在这个案例中,我们创建了一个简单的窗口,其中包含一个按钮和一个只读的文本框。我们通过四种不同的方式连接了按钮的clicked信号与显示消息的showMessage槽。
常见错误及改正:
当涉及到Qt的信号槽时,让我们举例说明一些常见错误,并展示如何进行改正:
错误1: 未连接信号与槽
// 错误示例 QObject::connect(button, SIGNAL(clicked()), this, SLOT(showMessage())); // 没有连接按钮的clicked信号与槽函数
改正方法:
// 正确示例 QObject::connect(button, &QPushButton::clicked, this, &MyWidget::showMessage);
错误2: 信号和槽参数不匹配
// 错误示例 class MyWidget : public QWidget { Q_OBJECT public slots: void slotWithInt(int value); }; // ... QObject::connect(sender, SIGNAL(someSignal()), this, SLOT(slotWithInt(QString))); // 参数不匹配
改正方法:
// 正确示例 class MyWidget : public QWidget { Q_OBJECT public slots: void slotWithInt(int value); }; // ... QObject::connect(sender, SIGNAL(someSignal(int)), this, SLOT(slotWithInt(int))); // 参数匹配
错误3: 未使用Q_OBJECT宏
// 错误示例 class MyWidget : public QWidget { public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) {} public slots: void showMessage() { /* ... */ } };
改正方法:
// 正确示例 class MyWidget : public QWidget { Q_OBJECT public: MyWidget(QWidget *parent = nullptr) : QWidget(parent) {} public slots: void showMessage() { /* ... */ } };
错误4: 跨线程连接未处理
// 错误示例 QObject::connect(sender, SIGNAL(someSignal()), receiver, SLOT(slotInDifferentThread())); // 未处理跨线程连接
改正方法:
// 正确示例 QObject::connect(sender, SIGNAL(someSignal()), receiver, SLOT(slotInDifferentThread()), Qt::QueuedConnection); // 使用Qt::QueuedConnection来处理跨线程连接
相关文章:
QT的信号槽的四种写法和五种链接方式
目录 四种信号槽写法: 五种连接方式: 实例: 常见错误及改正: 错误1: 未连接信号与槽 错误2: 信号和槽参数不匹配 错误3: 未使用Q_OBJECT宏 错误4: 跨线程连接未处理 在Qt中,信号(Signal)…...
Vue+SpringBoot项目开发:后台登陆功能的实现(二)
写在开始:一个搬砖程序员的随缘记录文章目录 一、SpringBoot项目的搭建二、数据库配置1、新建数据库2、新建用户表 三、SpringBoot项目的配置 一、SpringBoot项目的搭建 项目搭建传送门:从零开始,SpringBoot项目快速搭建 二、数据库配置 1、新建数据库…...
arcgis pro 3.0.2 安装及 geemap
arcgis pro 3.0.2 安装及 geemap arcgis pro 3.0.2 安装 arcgis pro 3 版本已经很多了,在网上找到资源就可以进行安装 需要注意的是:有的文件破解文件缺少,导致破解不成功。 能够新建地图就是成功了! geemap安装 1.需要进行环…...
oracle插入多表(insert all/first)
1、建测试表 CREATE TABLE EDW_INT (AGMT_NO VARCHAR2(40 BYTE) NOT NULL,AGMT_SUB_NO VARCHAR2(4 BYTE) NOT NULL,NEED_REPAY_INT NUMBER(22,2),CURR_PERIOD NUMBER(4) NOT NULL ); CREATE TABLE EDW_INT_1 (…...
工业以太网交换机-SCALANCE X200 环网组态
1.概述 SCALANCE X200 系列交换机自从2004年8月推入市场,当时交换机只能接入环网,不能做环网管理器。在各个工业现场得到了广泛的应用。2007年5月发布了X200系列新的硬件版本平台,普通交换机可以用HSR(高速冗余)方法做…...
利用 Splashtop Enterprise 改善公司的网络安全
在我们日益数字化的世界中,对强有力的网络安全措施的需求从未像现在这样迫切。随着组织扩大其数字足迹并采用远程办公解决方案,他们面临着一系列不断变化的挑战。 威胁行为者不断寻找利用漏洞的新方法,这使得企业保持领先地位至关重要。俗话…...
mqbroker.cmd闪退(mqnamesrv.cmd能正常启动)
解决: 用户目录下面store文件(如:C:\Users\Administrator\store或C:\Users\你的用户名\store),删除文件里面所有文件,再次启动即可。...
LeetCode--HOT100题(26)
目录 题目描述:142. 环形链表 II(中等)题目接口解题思路代码 PS: 题目描述:142. 环形链表 II(中等) 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返…...
HTTP 请求方法详解
HTTP 请求方法详解 请求方法 请求方法(Request Methods)是在 HTTP 请求中用于指定对目标资源执行的操作类型。每个请求都需要指定一个请求方法,以告知服务器要执行的操作。 以下是一些常见的 HTTP 请求方法及其主要用途: GET&…...
孤立随机森林(Isolation Forest)(Python实现)
目录 1 简介 2 孤立随机森林算法 2.1 算法概述 2.2 原理介绍 2.3 算法步骤 3 参数讲解 4 Python代码实现 5 结果 1 简介 孤立森林(isolation Forest)是一种高效的异常检测算法,它和随机森林类似,但每次选择划分属性和划…...
小程序如何自定义分享内容
小程序项目中遇到门票转增功能,用户可将自己购买的门票分享给好友,好友成功领取即得门票一张 1.自定义分享按钮 通过button里的open-type属性里的share参数即自可定义分享按钮 <button open-type"share">分享</button>2.配置分…...
SpringBoot整合WebSocket详解
环境:Springboot3.0.5 WebSocket介绍 WebSocket协议RFC 6455提供了一种标准化的方式,通过一个TCP连接在客户端和服务器之间建立全双工、双向的通信通道。它是一个不同于HTTP的TCP协议,但设计为在HTTP之上工作,使用80和443端口&am…...
伪原创神码ai怎么样【php源码】
这篇文章主要介绍了python汉化补丁包下载,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。 火车头采集ai伪原创插件截图: ** Spyder汉化(python汉化&…...
Air001基于Keil环境开发,使用airisp串口命令行烧录
Air001基于Keil环境开发,使用airisp串口命令行烧录 有人会有这样的疑惑,使用Keil平台开发,为什么不直接使用CMSIS-DAP直接烧录,还要使用串口方式来去单独烧录,不是我不想,目前使用合宙官方的Air103芯片版本…...
kubernetes 中的事件(event)简介以及如何收集event和基于event告警
引用另外一篇文章对k8s event的介绍 1.什么是kubernetes事件 Kubernetes Events 是一种 Kubernetes 资源对象,记录了某个组件在某个时间做了某个动作,用于展示集群内发生的情况,当 Kubernetes 集群中资源状态发生变化时,可以产生…...
C++小游戏贪吃蛇源码
graphics.h是针对DOS下的一个C语言图形库 (c也可以) 目前支持下载此头文件的常用的有两种: 1. EGE (Easy Graphics Engine)2. EasyX Graphics LibraryEGE, 全名Easy Graphics Engine, 是windows下的简易绘图库,是一个类似BGI(graphics.h)的面向C/C语言新手的图形库…...
【密码学】穴居人密码
穴居人密码 文字记载中,有时会把来自古希腊文化之前的各种记录作为密码学的例子,但称它们为密码学一定太不严格了,这是因为那些方法都太原始了。密码学的起源能追溯到多早,取决于你把密码学的相关定义确定得有多宽泛。大多数作者都…...
neo4j的CQL命令实例演示
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
vue3+ts使用antv/x6
使用 2.x 版本 x6.antv 新官网: 安装 npm install antv/x6 //"antv/x6": "^2.1.6",项目结构 1、初始化画布 index.vue <template><div id"container"></div> </template><script setup langts> import { onM…...
wsl1 ubuntu通过宿主机代理连接外网
文章目录 环境变量配置apt换源apt安装,测试是否能通外网可能出现的问题:Temporary failure resolving 参考 背景:公司电脑是局域网,通过走代理来连接外网 wsl1 ubuntu想要通过来连接宿主机的局域网代理,访问外网 可以…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
