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

2023-11-13

目录

四种信号槽写法:

五种连接方式:

实例:

常见错误及改正:

错误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_OBJECT

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT的信号槽的四种写法和五种链接方式 的相关文章

  • 通过CMake实现Qt项目

    我正在尝试通过 Cmake 构建并运行非常简单且基本的 Qt 示例 删除 pro 文件 以下是Qt项目的代码 自动生成的Qt项目的目录结构为 Cmake my project name headers mainwindow h source
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • 如何在Qt无框窗口中实现QSizeGrip?

    如何使用 Qt 无框窗口实现 QSizeGrip 代码会是什么样的 您只需在布局内窗口的一角添加 QSizeGrip 即可使其保持在该角落 QDialog dialog new QDialog 0 Qt FramelessWindowHin
  • 如何将 QByteArray 转换为十六进制字符串?

    我有打击QByteArray QByteArray ba ba 0 0x01 ba 1 0x10 ba 2 0x00 ba 3 0x07 我真的不知道如何将此 QByteArray 转换为结果字符串 其中包含 01100007 我将使用 Q
  • SWI-Prolog 与 C++ 接口的问题

    我试图让 SWI Prolog 与 C 很好地配合 现在束手无策 现在 在我开始准确解释我的问题是什么之前 我想首先说明我的项目是关于什么的以及我选择了哪些工具来开发解决方案 我的教授分配给我的任务是开发一个 GUI 程序 作为 SWI p
  • 如何在 QT 中绘制点?

    我正在用 QT 用 C 编写一个应用程序 其中有 n 个点并计算它的凸包 然而 一旦计算出来 我不知道如何绘制点并绘制船体的边界 制作菜单按钮等很简单 但我不确定我是否知道执行此操作的工具 你怎么做到这一点 图形视图 addEllipse
  • 仅在内部/外部抚摸路径?

    Given a QPainterPath http qt project org doc qt 4 8 qpainterpath html如何仅在路径的内侧或外侧边缘 或非闭合路径的左侧或右侧 描边路径 QPainter strokePat
  • 有没有办法向 QListView 添加部分?

    我正在使用 Qt5 2 和 C 来实现一个应用程序 需要显示一个列表 其中包含类似于下面的示例图像的部分 source ngo hung com http www ngo hung com files images contact list
  • 第一次信号发射后自动断开

    我正在从文件加载网页 然后替换其中的一些 html self template web page QtWebKit QWebPage self template web page mainFrame load QtCore QUrl tem
  • QT:删除QGridLayout中QLabel之间的空格

    我将一些具有不同颜色的 QLabels 添加到 QGridLayout 作为 QWidget 的布局 现在我在每个 Qlabel 与下一个 Qlabel 之间有一个间距 我想将其删除 我尝试将标签的边距设置为 0 将 GridLayout
  • 使用 CMake 编译时更改头文件位置会导致缺少 vtable 错误

    对于一个大型 C 项目 我需要从 qmake 过渡到 CMake 但是在处理一个玩具示例时 我遇到了一些我不理解的行为 示例代码具有单个头文件 当该头文件移动到子目录中时 我收到 MainWindow 类缺少 vtable 的错误 CMak
  • QTableView 并双击一个单元格

    我正在开发测试用例编辑器 该编辑器包含 USART 传输和接收数据包格式 编辑器是一个表格视图 发送和接收数据包的长度为八个字节 例如 0x01 0x02 0x03 0x08 它在我的第五和第六栏中 现在 我希望此列中的单元格为只读 但是当
  • 如何doxygen注释Qt属性?

    我想将 Doxygen 注释附加到我的 Q PROPERTY 例如 song h class Song public QObject Q OBJECT private Q PROPERTY QString title READ title
  • Qt中Q_PROPERTY的意义是什么?

    我无法理解 Q PROPERTY 的用法 Q PROPERTY 如何帮助程序具有防御性 它是干什么用的 我看过这个论坛 但确实无法应用 我已经理解了这个例子 但不明白它的用法 这是一个例子 我能从中得到什么 我知道阅读将赋予只读特权 wri
  • 针对初学者的 QT 商业许可证与非商业许可证 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 QT 许可似乎非常反学习 因为据我所知 用它开发的任何东西都只能是商业的当且仅当 its entire开发是在使用商业许可证的情况下完成的
  • 覆盖 QWebView 中的页面回复

    我试图在 Qt 的 QWebView 中拦截页面 表单请求 并在某些情况下使用替代内容进行响应 QNetworkReply ngcBrowser createRequest Operation operation const QNetwor
  • QML 列表视图拖放

    我想创建两个 qml 列表视图 可以执行两个功能 拖放一个列表中的项目以更改项目的顺序 跨列表拖放项目 项目将从一个列表中删除并添加到另一个列表中 根据 Qt 文档中的拖放示例 我决定创建两个访问同一列表模型的列表视图 列表模型中的每个项目
  • Qt 支持 Windows 蓝牙 API 吗?

    谁能告诉我 Qt 是否支持 Windows 蓝牙 API 如果是这样 您能否分享一些有关如何使用它的信息 自上次答复以来 这个问题的答案发生了一些变化 Qt 5 2 版为 Linux BlueZ 和 BlackBerry 设备实现了蓝牙 A
  • Q风格所有权

    在 Qt 应用程序中使用样式时 我遇到了一个有趣的问题QStyle所有权 QStyle继承自QObject 通常接受QObject parent作为构造函数参数来管理其子级的生命周期 但QStyle的构造函数没有此构造函数参数 第一个问题
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某

随机推荐

  • 【华为OD机试2023】字符串解密 java python c++

    字符串解密 题目 题目描述 给定两个字符串string1和string2 string1是一个被加扰的宇符串 string1由小写英文字母 a z 和数字字符 0 9 组成 而加扰字符串由 0 9 a z 组成 string1里面可能包含0
  • 使用js控制浏览器开启全屏,判断浏览器是否处于全屏状态

    引入lodash import from lodash 切换全屏方法 export function fullScreen isOpen target let dom target void 0 let open list requestF
  • 什么是.Net?

    NET 是一个开发平台 或者叫开发者平台 使用 NET 你可以创建不同类型的应用程序 使用多种开发语言 编辑器和工具库创建网页 手机 桌面以及游戏等应用 其核心特点是 免费 开源和跨平台 1 语言和平台 我们先来理解一下什么是 NET 开发
  • URL 转为QR code(二维码)

    总结几种把网页url转为二维码的方法 1 Chrome浏览器 最快的一种方法就是用chrome自带的QR code分享 这种方法的缺点就是不能自定义二维码的格式 颜色 logo之类的 都是默认的小恐龙图标 2 chrome插件 可以在chr
  • 关于非同一局域网下两台设备之间的网络通信(服务器的作用)

    看过很多关于局域网下的两台设备之间的通信方式 最多的就是通过socket进行tcp ip通信 建立一个服务端 再建立一个客户端 客户端向服务端发起请求连接 然后再进行两端的通信 但发现其实这却存在着很多的问题与不足 如果是不在同一局域网下的
  • 新手搭建 react antd 环境笔记

    安裝依赖 npm install g create react app npm install antd mobile save npm install less loader less save dev npm install react
  • LeetCode【345】反转字符串中的元音字母

    题目 编写一个函数 以字符串作为输入 反转该字符串中的元音字母 示例 1 输入 hello 输出 holle 示例 2 输入 leetcode 输出 leotcede 说明 元音字母不包含字母 y public class LeetCode
  • linux system call

    1 SYSCALL DEFINE4 reboot 2 int magic1 3 int magic2 4 unsigned int cmd 5 void user ang 6 7 if capable CAP SYS BOOT 8 retu
  • python数据分析练习题

    本次作业尝试使用ipython和jupyter的notebook功能来实现py代码 首先是要配置环境 通过命令 pip install ipython pip install jypyter ipython notebook 配置并打开no
  • [机器学习]1.2虚拟环境&基础包安装初始化

    机器学习 第一章 Centos环境安装初始化 第二章 virtualenv及基础包环境安装初始化 机器学习 1 2虚拟环境 基础包安装初始化 机器学习 前言 一 python安装 二 pip3 virtualenv安装及环境变量配置 1 配
  • 08 FPGA—计数器与分频器的应用

    1 理论 时序逻辑电路中最基本的单元 寄存器 我们可以使用寄存器来做计数器 基本上关于时间的设计都离不开计数器 计数器在数字系统中主要是对脉冲的个数进行计数 以实现测量 计数和控制的功能 同时兼有分频功能 计数器一般都是从 0 开始计数 计
  • 第四章-图像加密与解密

    加密与加密原理 使用异或运算实现图像加密及解密功能 异或运算规则 相同为0 不同为1 运算数相同 结果为0 运算数不同 结果为1 任何数 0 1 与0异或 结果仍为自身 任何数 0 1 与1异或 结果为另外一个数 即0变1 1变0 任何数和
  • Ubuntu查看系统日志的几种方法

    在 Ubuntu 22 10 中 你可以查看系统日志来排查错误 以下是几种查看日志的方法 一 Journalctl 命令 使用 journalctl 命令可以查看系统日志信息 包括引起闪退的错误信息 你可以运行以下命令来查看最新的系统日志
  • GDAL根据Shape文件切图(java)

    目地 用Java实现类似QGIS中 按掩膜图层裁剪栅格 的功能 其实QGIS本身调用的就是gdalwarp exe 官方文档 https gdal org programs gdalwarp html gdalwarp gdalwarp h
  • js == 运算规则解析

    1 先了解一下基本类型和复杂类型划分的依据 JS中的值有两种类型 原始类型 Primitive 对象类型 Object 原始类型包括 Undefined Null Boolean Number和String等五种 这两大类别的数据存储方式是
  • 启明智显分享

    提示 作为Espressif 乐鑫科技 大中华区合作伙伴及sigmastar 厦门星宸 VAD合作伙伴 启明智显不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程供开发小伙伴参考 同时也用心整理了乐鑫及星宸科技的新产品 新方
  • 软文营销研究目标关键词让内容简单明了

    随着行业的发展 许多企业正在进入文案领域 对于喜欢写作的人来说 这是一条很好的道路 但对某些人来说也可能具有挑战性 一些初学者可能会觉得自己没有写作能力达不到标准 因此本文178软文网小编将帮你决定并学习如何成写出一篇成功有效的文案 一 向
  • yolov3整体工作流程(个人理解,欢迎纠正和补充)

    以下内容纯属个人理解 请路过的小伙伴留下宝贵意见 欢迎纠正和补充 谢谢 yolov3的总体思想归纳 首先 将输入图片压缩到416 416 通过特征提取网络 Darknet53 without FC layer 对输入图像提取特征得到大小一定
  • ubuntu下设置网络

    修改文件 etc network interfaces 命令 sudo vi etc network interfaces 或 sudo gedit etc network interfaces 我的配置如下 interfaces 5 fi
  • QT的信号槽的四种写法和五种链接方式

    目录 四种信号槽写法 五种连接方式 实例 常见错误及改正 错误1 未连接信号与槽 错误2 信号和槽参数不匹配 错误3 未使用Q OBJECT宏 错误4 跨线程连接未处理 在Qt中 信号 Signal 和槽 Slot 是一种用于对象之间通信的