当前位置: 首页 > news >正文

QT的信号槽的四种写法和五种链接方式

目录

四种信号槽写法:

五种连接方式:

实例:

常见错误及改正:

错误1: 未连接信号与槽

错误2: 信号和槽参数不匹配

错误3: 未使用Q_OBJECT宏

错误4: 跨线程连接未处理


 

在Qt中,信号(Signal)和槽(Slot)是一种用于对象之间通信的机制,用于实现一种松耦合的方式。信号被发送时,与之相关联的槽会被调用。以下是四种常见的信号槽写法以及五种连接方式:

四种信号槽写法:

  1. 直接函数连接

    QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

    这是Qt早期的连接语法,使用字符串表示信号和槽。在编译时无法进行类型检查。

  2. 函数指针连接

    QObject::connect(sender, &SenderClass::signal, receiver, &ReceiverClass::slot);

    这种连接方式在编译时进行了类型检查,但在一些情况下可能不够灵活,比如连接到一个基类的槽。

  3. Lambda表达式连接(C++11及以后版本):

    QObject::connect(sender, &SenderClass::signal, [=]() { /* slot implementation */ });

    这种方式可以使用Lambda表达式作为槽的实现,非常方便。

  4. Qt5新语法连接

    QObject::connect(sender, &SenderClass::signal, receiver, &ReceiverClass::slot, Qt::ConnectionType);

    这种语法在Qt5中引入,允许指定连接类型,例如Qt::AutoConnectionQt::DirectConnection等。

五种连接方式:

  1. AutoConnection:根据信号和槽所在的线程自动选择连接方式。如果在同一线程,则使用DirectConnection,否则使用QueuedConnection

  2. DirectConnection:信号被发送时,直接调用槽函数。适用于信号和槽在同一线程的情况。

  3. QueuedConnection:将信号放入接收者线程的事件队列中,由接收者线程在适当的时候处理。适用于跨线程通信。

  4. BlockingQueuedConnection:与QueuedConnection类似,但发送信号的线程会被阻塞,直到接收者线程处理完信号。

  5. 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的信号槽的四种写法和五种链接方式

目录 四种信号槽写法&#xff1a; 五种连接方式&#xff1a; 实例&#xff1a; 常见错误及改正&#xff1a; 错误1: 未连接信号与槽 错误2: 信号和槽参数不匹配 错误3: 未使用Q_OBJECT宏 错误4: 跨线程连接未处理 在Qt中&#xff0c;信号&#xff08;Signal&#xff09…...

Vue+SpringBoot项目开发:后台登陆功能的实现(二)

写在开始:一个搬砖程序员的随缘记录文章目录 一、SpringBoot项目的搭建二、数据库配置1、新建数据库2、新建用户表 三、SpringBoot项目的配置 一、SpringBoot项目的搭建 项目搭建传送门&#xff1a;从零开始&#xff0c;SpringBoot项目快速搭建 二、数据库配置 1、新建数据库…...

arcgis pro 3.0.2 安装及 geemap

arcgis pro 3.0.2 安装及 geemap arcgis pro 3.0.2 安装 arcgis pro 3 版本已经很多了&#xff0c;在网上找到资源就可以进行安装 需要注意的是&#xff1a;有的文件破解文件缺少&#xff0c;导致破解不成功。 能够新建地图就是成功了&#xff01; 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月推入市场&#xff0c;当时交换机只能接入环网&#xff0c;不能做环网管理器。在各个工业现场得到了广泛的应用。2007年5月发布了X200系列新的硬件版本平台&#xff0c;普通交换机可以用HSR&#xff08;高速冗余&#xff09;方法做…...

利用 Splashtop Enterprise 改善公司的网络安全

在我们日益数字化的世界中&#xff0c;对强有力的网络安全措施的需求从未像现在这样迫切。随着组织扩大其数字足迹并采用远程办公解决方案&#xff0c;他们面临着一系列不断变化的挑战。 威胁行为者不断寻找利用漏洞的新方法&#xff0c;这使得企业保持领先地位至关重要。俗话…...

mqbroker.cmd闪退(mqnamesrv.cmd能正常启动)

解决&#xff1a; 用户目录下面store文件&#xff08;如&#xff1a;C:\Users\Administrator\store或C:\Users\你的用户名\store&#xff09;&#xff0c;删除文件里面所有文件&#xff0c;再次启动即可。...

LeetCode--HOT100题(26)

目录 题目描述&#xff1a;142. 环形链表 II&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;142. 环形链表 II&#xff08;中等&#xff09; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返…...

HTTP 请求方法详解

HTTP 请求方法详解 请求方法 请求方法&#xff08;Request Methods&#xff09;是在 HTTP 请求中用于指定对目标资源执行的操作类型。每个请求都需要指定一个请求方法&#xff0c;以告知服务器要执行的操作。 以下是一些常见的 HTTP 请求方法及其主要用途&#xff1a; GET&…...

孤立随机森林(Isolation Forest)(Python实现)

目录 1 简介 2 孤立随机森林算法 2.1 算法概述 2.2 原理介绍 2.3 算法步骤 3 参数讲解 4 Python代码实现 5 结果 1 简介 孤立森林&#xff08;isolation Forest&#xff09;是一种高效的异常检测算法&#xff0c;它和随机森林类似&#xff0c;但每次选择划分属性和划…...

小程序如何自定义分享内容

小程序项目中遇到门票转增功能&#xff0c;用户可将自己购买的门票分享给好友&#xff0c;好友成功领取即得门票一张 1.自定义分享按钮 通过button里的open-type属性里的share参数即自可定义分享按钮 <button open-type"share">分享</button>2.配置分…...

SpringBoot整合WebSocket详解

环境&#xff1a;Springboot3.0.5 WebSocket介绍 WebSocket协议RFC 6455提供了一种标准化的方式&#xff0c;通过一个TCP连接在客户端和服务器之间建立全双工、双向的通信通道。它是一个不同于HTTP的TCP协议&#xff0c;但设计为在HTTP之上工作&#xff0c;使用80和443端口&am…...

伪原创神码ai怎么样【php源码】

这篇文章主要介绍了python汉化补丁包下载&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 火车头采集ai伪原创插件截图&#xff1a; ** Spyder汉化&#xff08;python汉化&…...

Air001基于Keil环境开发,使用airisp串口命令行烧录

Air001基于Keil环境开发&#xff0c;使用airisp串口命令行烧录 有人会有这样的疑惑&#xff0c;使用Keil平台开发&#xff0c;为什么不直接使用CMSIS-DAP直接烧录&#xff0c;还要使用串口方式来去单独烧录&#xff0c;不是我不想&#xff0c;目前使用合宙官方的Air103芯片版本…...

kubernetes 中的事件(event)简介以及如何收集event和基于event告警

引用另外一篇文章对k8s event的介绍 1.什么是kubernetes事件 Kubernetes Events 是一种 Kubernetes 资源对象&#xff0c;记录了某个组件在某个时间做了某个动作&#xff0c;用于展示集群内发生的情况&#xff0c;当 Kubernetes 集群中资源状态发生变化时&#xff0c;可以产生…...

C++小游戏贪吃蛇源码

graphics.h是针对DOS下的一个C语言图形库 (c也可以) 目前支持下载此头文件的常用的有两种: 1. EGE (Easy Graphics Engine)2. EasyX Graphics LibraryEGE, 全名Easy Graphics Engine, 是windows下的简易绘图库&#xff0c;是一个类似BGI(graphics.h)的面向C/C语言新手的图形库…...

【密码学】穴居人密码

穴居人密码 文字记载中&#xff0c;有时会把来自古希腊文化之前的各种记录作为密码学的例子&#xff0c;但称它们为密码学一定太不严格了&#xff0c;这是因为那些方法都太原始了。密码学的起源能追溯到多早&#xff0c;取决于你把密码学的相关定义确定得有多宽泛。大多数作者都…...

neo4j的CQL命令实例演示

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

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安装&#xff0c;测试是否能通外网可能出现的问题&#xff1a;Temporary failure resolving 参考 背景&#xff1a;公司电脑是局域网&#xff0c;通过走代理来连接外网 wsl1 ubuntu想要通过来连接宿主机的局域网代理&#xff0c;访问外网 可以…...

Qt学习及使用_第1部分_认识Qt---学习目的及技术准备

前言 学以致用,通过QT框架的学习,一边实践,一边探索编程的方方面面. 参考书:<Qt 6 C开发指南>(以下称"本书") 标识说明:概念用粗体倾斜.重点内容用(加粗黑体)---重点内容(红字)---重点内容(加粗红字), 本书原话内容用深蓝色标识,比较重要的内容用加粗倾…...

如何使用Jmeter进行压力测试?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是压力测试 软件测试中&#xff1a;压力测试&#xff08;Stress Test&#xff09;&#xff0c;也称为强度测试、负载测试。压力测试是模拟实际应用的软硬…...

vue3: bingmap using typescript

项目结构&#xff1a; <template><div class"bing-map-market"><!-- 加载遮罩层 --><div class"loading-overlay" v-show"isLoading || errorMessage"><div class"spinner-container"><div class&qu…...

Android实现点击Notification通知栏,跳转指定activity页面

效果 1、点击通知栏通知&#xff0c;假如app正在运行&#xff0c;则直接跳转到指定activity显示具体内容&#xff0c;在指定activity中按返回键返回其上一级页面。 2、点击通知栏通知&#xff0c;假如app已经退出&#xff0c;先从SplashActivity进入&#xff0c;显示app启动界…...

机器学习监督学习实战五:六种算法对声呐回波信号进行分类

本项目基于UCI的声呐目标识别数据集&#xff08;Sonar, Mines vs. Rocks&#xff09;&#xff0c;通过10种机器学习算法比较&#xff0c;发现集成学习方法表现最优。研究首先对60个声呐能量特征进行可视化分析&#xff08;分布直方图、相关性矩阵&#xff09;&#xff0c;对比了…...

Faiss向量数据库全面解析:从原理到实战

Faiss向量数据库全面解析&#xff1a;从原理到实战 引言&#xff1a;向量搜索的时代需求 在AI技术爆发的今天&#xff0c;向量数据已成为表示文本、图像、音视频等内容的核心形式。Facebook AI研究院开源的Faiss&#xff08;Facebook AI Similarity Search&#xff09;作为高…...

使用ORM Bee (ormbee) ,如何利用SQLAlchemy的模型生成数据库表.

使用ORM Bee (ormbee) &#xff0c;如何利用SQLAlchemy的模型生成数据库表. 将原来SQLAlchemy的模型&#xff0c;修改依赖为&#xff1a; from bee.helper import SQLAlchemy 然后就可以开始生成了。很简单&#xff0c;主要是两个接口。 db.create_all(True) #创建所有模型的表…...

# 主流大语言模型安全性测试(二):英文越狱提示词下的表现与分析

主流大语言模型安全性测试&#xff08;二&#xff09;&#xff1a;英文越狱提示词下的表现与分析 在上一篇文章中&#xff0c;我们对多个主流大语言模型&#xff08;LLM&#xff09;进行了中文诱导性提示词的越狱测试&#xff0c;评估其是否能够在面对非法、有害或危险内容请求…...

【Java开发日记】说一说 SpringBoot 中 CommandLineRunner

目录 1、CommandLineRunner SpringBoot中CommandLineRunner的作用 简单例子 多个类实现CommandLineRunner接口执行顺序的保证 通过实现Ordered接口实现控制执行顺序 通过Order注解实现控制执行顺序 Order 作用 2、ApplicationRunner 3、传递参数 4、源码跟踪 run()方…...

使用矩阵乘法+线段树解决区间历史和问题的一种通用解法

文章目录 前言P8868 [NOIP2022] 比赛CF1824DP9990/2020 ICPC EcFinal G 前言 一般解决普通的区间历史和&#xff0c;只需要定义辅助 c h s − t ⋅ a chs-t\cdot a chs−t⋅a&#xff0c; h s hs hs是历史和&#xff0c; a a a是区间和&#xff0c; t t t是时间戳&#xff0c…...