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来处理跨线程连接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/30210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openEuler-OECA考试报名火热开启,尊享半价优惠 作者:HopeInfra 发布时间:2023-08-10

近日&#xff0c;润和软件人才评定报名系统已成功上线运行&#xff0c;现openEuler-OECA人才评定考试报名优惠活动火热开启&#xff0c;欢迎大家报名咨询&#xff01; 关于openEuler人才评定 随着openEuler及其发行版本在各个行业使用量逐年增多&#xff0c;相关人才的评定诉求…

突破笔试:力扣129. 求根节点到叶节点数字之和

1. 题目链接&#xff1a;129. 求根节点到叶节点数字之和 给你一个二叉树的根节点 root &#xff0c;树中每个节点都存放有一个 0 到 9 之间的数字。每条从根节点到叶节点的路径都代表一个数字&#xff1a;例如&#xff0c;从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 …

http相关知识点

文章目录 长链接http周边会话保持方案1方案2 基本工具postmanFiddlerFiddler的原理 长链接 一张网页实际上可能会有多种元素组成&#xff0c;这也就说明了网页需要多次的http请求。可由于http是基于TCP的&#xff0c;而TCP创建链接是有代价的&#xff0c;因此频繁的创建链接会…

大数据Flink(五十六):Standalone伪分布环境(开发测试)

文章目录 Standalone伪分布环境(开发测试) 一、架构图 二、环境准备 三、下载安装包</

微信小程序 map地图(轨迹)

allMarkers效果图 废话少说直接上马&#xff08;最后是我遇到的问题&#xff09; cover-view是气泡弹窗&#xff0c;可以自定义弹窗&#xff0c;要配合js&#xff1a;customCallout&#xff0c;如果是非自定义的话&#xff1a;callout&#xff08;可以修改颜色、边框宽度、圆角…

java输出GB2312、GBK、GB18030、UTF-8所有的字符

相关文章 【转】彻底搞明白 GB2312、GBK 、GB18030和UTF-8 1.ASICII、GB2312、GBK、GB18030 以及 UTF8 的关系 2.编写代码 引入依赖&#xff1a;hutool工具类 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId>&…

轻松批量自定义重命名,为文件夹加上个性化编号!

在日常生活和工作中&#xff0c;我们经常需要对大量的文件夹进行重命名&#xff0c;以更好地管理和整理文件。然而&#xff0c;手动逐个修改文件夹名称费时费力&#xff0c;效率低下。现在&#xff0c;我们为您推荐一款简单易用的工具&#xff0c;可以帮助您快速批量自定义重命…

LoRaWAN网关与网络服务器(NS)的通信CUPS 协议介绍

LoRa Basics™ Station 定期查询 CUPS 服务器以获取更新。该协议是 HTTP/REST,使用Credentials中描述的客户端/服务器身份验证方法。对于每个查询,工作站都会提供有关其当前状态的信息,并接收包含其 LNS 和 CUPS 凭证更新的二进制 blob,以及具有任意更新的通用数据段。 通…

网络安全的相关知识点

网络安全威胁类型&#xff1a; 1.窃听&#xff1a;广播式网络系统。 2.假冒 3.重放&#xff1a;重复一份报文或者报文的一部分&#xff0c;以便产生一个被授权的效果。 4.流量分析 5.数据完整性破坏 6.拒绝服务 7.资源的非授权使用 8.陷门和特洛伊木马&#xff1a;木马病毒有客…

Java课题笔记~ Spring 的事务管理

一、Spring 的事务管理 事务原本是数据库中的概念&#xff0c;在 Dao 层。但一般情况下&#xff0c;需要将事务提升到业务层&#xff0c;即 Service 层。这样做是为了能够使用事务的特性来管理具体的业务。 在 Spring 中通常可以通过以下两种方式来实现对事务的管理&#xff…

花样滑冰选手骨骼点动作识别

2023 CCF BDCI 基于飞桨实现花样滑冰选手骨骼点动作识别 16名方案以及总结 比赛任务 花样滑冰与其他运动项目相比&#xff0c;其动作类型的区分难度更大&#xff0c;这对识别任务来说是极大的挑战。对于花样滑冰动作识别任务&#xff0c;主要难点如下&#xff1a; (1) 花样滑…

Python-OpenCV中的图像处理-图像梯度

Python-OpenCV中的图像处理-图像梯度 图像梯度Sobel 算子和 Scharr 算子Laplacian 算子 图像梯度 图像梯度&#xff0c;图像边界等使用到的函数有&#xff1a; cv2.Sobel()&#xff0c; cv2.Scharr()&#xff0c; cv2.Laplacian() 等原理&#xff1a;梯度简单来说就是求导。Op…

fastadmin、vue、react图标库适用于多种框架

在二开fastadmin中&#xff0c;在写vue以及react时&#xff0c;侧边导航栏以及按钮中常常需要很多图标&#xff0c;那么这些图标应该去哪里得到呢&#xff0c;在这里给大家一个链接&#xff0c;这里有丰富的图标库&#xff0c;可以找到自己想要的进行使用。 点击下方链接&…

github pages 用法详解 发布自己的网站

github pages 基础用法 URL 规则 假设你的 github 帐号为 mygithub&#xff0c;需要发布的仓库名为 myrepo&#xff0c;那么 pages 的 URL 为&#xff1a; https://mygithub.github.io/myrepo 添加内容 用任意编辑器写好&#xff08;或者生成&#xff09;标准的网页内容&a…

苹果正在测试新款Mac mini:搭载M3芯片 配备24GB大内存

据悉苹果目前正在测试新的Mac机型&#xff0c;亮点是采用最新的M3芯片。 据报道&#xff0c;首款搭载M3芯片的设备应该是13英寸的MacBook Pro和重新设计的MacBook Air&#xff0c;Mac mini机型并不在名单上。 M3和M2同样拥有最多8个核心&#xff0c;分别为4个性能核和4个能效核…

OpenAI-Translator 实战总结

最近在极客时间学习《AI 大模型应用开发实战营》&#xff0c;自己一边跟着学一边开发了一个进阶版本的 OpenAI-Translator&#xff0c;在这里简单记录下开发过程和心得体会&#xff0c;供有兴趣的同学参考 功能概览 通过openai的chat API&#xff0c;实现一个pdf翻译器实现一个…

Python爬虫——selenium的安装和基本使用

1.什么是selenium&#xff1f; selenium是一个用于web应用程序测试的工具selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样支持通过各种driver&#xff08;FrifoxDriver&#xff0c;ItenrentExploreDriver&#xff0c;OperaDriver&#xff0c;ChromeDrive…

【BASH】回顾与知识点梳理(十四)

【BASH】回顾与知识点梳理 十四 十四. 文件与目录的默认权限与隐藏权限14.1 文件预设权限&#xff1a;umaskumask 的利用与重要性&#xff1a;专题制作 14.2 文件隐藏属性chattr (配置文件案隐藏属性)lsattr (显示文件隐藏属性) 14.3 文件特殊权限&#xff1a; SUID, SGID, SBI…

了解华为(H3C)网络设备和OSI模型基本概念

目录 一&#xff0c;认识华为 1.华为发展史 2.华为网络设备介绍 3.VRP概述 二&#xff0c;OSI七层模型 1.七层模型详细表格 2.各层的作用 3.数据在各层之间的传递过程 4.OSI四层网络模型 一&#xff0c;认识华为 官网&#xff1a;https://www.huawei.com/cn/ 1.华为发…

从‘深林’到潮鞋App:得物如何改变电商格局”

在App Store上搜索下载得物App&#xff0c;惊奇发现其下载量达到百万级别&#xff0c;媲美同期京东App的下载量。 这是一个不小的数据体量&#xff0c;对此我产生了极大的好奇&#xff1a;“在淘宝系、京东、唯品会等电商巨头林立的现状下&#xff0c;单依靠潮鞋的得物凭什么能…