Qt 信号与槽的各种连接方式

2023-11-10

作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

简介

信号槽是 Qt 框架引以为豪的机制之一。当用户触发某个事件时,就会发出一个信号(signal),这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会连接(connect)绑定一个函数(称为槽slot)来处理这个信号。也就是说当信号发出时,被连接的槽函数会自动被回调。这有点类似与开发模式中的观察者模式,即当发生了感兴趣的事件,某一个操作就会被自动触发

信号和槽是Qt特有的信息传输机制,是Qt设计程序的重要基础,它可以让互不干扰的对象建立一种联系。槽的本质是类的成员函数,其参数可以是任意类型的。和普通C++成员函数几乎没有区别,它可以是虚函数,也可以被重载。可以是公有的、保护的、私有的、也可以被其他C++成员函数调用。唯一区别的是:槽可以与信号连接在一起,每当和槽连接的信号被发射的时候,就会调用这个槽

连接信号槽 connect 函数的第五个参数

connect 函数原型如下:
[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

ConnectionType 是一个定义在 Qt namespace 中的一个枚举,具体内容如下:

enum ConnectionType {
	AutoConnection,
	DirectConnection,
	QueuedConnection,
	BlockingQueuedConnection,
	UniqueConnection =  0x80
};
  1. Qt::AutoConnection:默认值。根据 sender 和 receiver 所处线程在信号发出时作出判断。如果在同一线程则使用 Qt::DirectConnection 连接,否则使用 Qt :: QueuedConnection 连接。需要注意的是,这个判断和 sender 对象所处线程无关,真正判断的是发出信号这个动作所在的线程
  2. Qt::DirectConnection:槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用了槽函数。需要注意的是,在多线程环境下比较危险,可能会造成奔溃
  3. Qt::QueuedConnection:槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个
  4. Qt::BlockingQueuedConnection:槽函数的调用时机与 Qt::QueuedConnection 一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完,在多线程间需要同步的场合可能需要这个。需要注意的是,接收者和发送者绝对不能在一个线程,否则程序会死锁
  5. Qt::UniqueConnection:这个 flag 可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败,也就是避免了重复连接

信号与槽的连接方式

  1. C++ 连接信号槽 - Qt4 语法
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(close()));

  2. C++ 连接信号槽 - Qt5 语法
    connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::close)

  3. C++ 连接信号槽 - 函数指针
    void(MainWindow:: *buttonClickSlot)() = &MainWindow::onButtonPushed;
    connect(ui->pushButton, &QPushButton::clicked, this, buttonClickSlot);

  4. C++ 连接信号槽 - Lambda 表达式
    connect(ui->pushButton, &QPushButton::clicked, this, [=](){ this->close(); });

  5. C++ 信号连接 QML 的槽

class Test {
signals:
	void sendData(QString str);    
}

1)如果注册的是全局对象,则需要使用 Connections 连接:

Connections {
    target: test
    onSendData: {
        console.log(str)
    }
}

2)如果注册的是类,则需要先实例化对象,之后直接使用 on 接收:

Test {
	onSendData: {
        console.log(str)
    }
}
  1. QML 信号连接 C++ 的槽
#include <QQuickItem>
QObject *quitButton = root->findChild<QObject*>("quitButton");
if (quitButton) {
    QObject::connect(quitButton, SIGNAL(clicked()), &app, SLOT(quit()));
}
  1. C++ 调用 QML 函数
QObject *changeBtn = root->findChild<QObject*>("objectName");
if (changeBtn)
{
    QMetaObject::invokeMethod(changeBtn, "changeColor");
}
  1. QML 调用 C++ 函数
onClicked:
{
    className.test();
}
  1. QML 信号连接 QML 的槽
// A.qml
Rectangle {
	signal sendData(var data)
}
// B.qml
Rectangle {
	onSendData: console.log(data)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 信号与槽的各种连接方式 的相关文章

  • 无法将 QMap 传递到 SLOT

    所以 这有效 h public slots void addMenu QString passedName signals void clicked const QString text cpp signalMapper new QSign
  • QMainWindow::showMaximized() 不更新大小

    我正在尝试创建一个QMainWindow封装一个QGraphicsView我把它放进去 我希望它一开始就最大化 所以我这样做 QMainWindow mainWindow new QMainWindow mainWindow gt setW
  • 如何在点击 Qtablewidget 单元格时获取放置在该单元格中的小部件的行号?

    我正在尝试的是当用户选择项目时获取 QcomboBox 的行号 虽然使用它很容易获得单元格的列和行 cellClicked int int 信号 但仅当单元格上没有小部件时才有效 那么如果单元格中放置了小部件 如何获取行号 Note 所有组
  • 如何管理返回到 QML 的动态分配的 QObject 的生命周期?

    我有这个代码 QVariant componentFromCode QString code QQmlComponent component new QQmlComponent engine engine gt setObjectOwner
  • 将信号/槽(QObject)添加到 QGraphicsItem:性能受到影响?

    我想将信号 槽添加到 QGraphicsItem 以便我可以从另一个线程访问 QGraphicsItemObjects 我知道有两个选项 使用 QGraphicsObject 或从 QObject 和 QGraphicsItem 继承 使用
  • QT“找不到 Qt 平台插件“xcb””

    我出于学术原因安装了QT everywhere 5 15开源版 但无法运行程序 首先 我编译了必要的源文件make并安装了QT Creator 然后我选择qmake来运行其中的程序 当我尝试运行示例程序时 遇到以下错误 qt qpa plu
  • Qt 远程文件浏览器

    我想知道是否有人使用过 Qt 远程文件浏览器 根据我的理解 我有两个选择 当涉及到远程文件时 将 QFileDilaog 与自定义代理模型结合使用 该模型将负责提供远程文件 目录结构 使用自定义对话框 并为本地文件提供标准文件系统模型 为远
  • Mac OS X 文件关联有效,但文件图标未更改

    我使用 Qt 5 3 2 开发了一个 Mac 应用程序 该应用程序处理具有特定扩展名的文件 比方说 xyz 我创建了一个名为 XYZ icns 的图标文件 并将其添加到我的应用程序包资源文件夹中 MyApp app Contents Res
  • QGroupBox边框

    经过一段时间的搜索后 我发现在组框上设置可见边框的方法是使用 StyleSheet 属性 我补充道 border 2px solid gray 但有几个问题 1 组框内的所有内容也继承此设置 2 边框在标题附近有一个小洞 碎片缺失 Here
  • 删除 QComboBox“下拉”动画

    我正在使用 Qt 4 8 并且想在单击 QComboBox 时摆脱 下拉 动画 我也想稍微移动一下 到目前为止 我一直在考虑重新实现 showPopup 和 hidePopup 但不知道如何使其工作 此外 每次我尝试使用 CSS 进行移动或
  • 将项目添加到自定义组件的布局

    我有一个习惯Footer Component我想在 QML 应用程序的不同位置重用它 Rectangle color gold height 50 anchors bottom parent bottom left parent left
  • 对齐坐标系

    Let s say I have 2 coordinate systems as it is shown in image attached 如何对齐这个坐标系 我知道我需要将第二个坐标系围绕 X 平移 180 度 然后将其平移到第一个坐标
  • cx_freeze:QODBC 驱动程序未加载

    我的 python 应用程序如下所示 test py from PyQt4 import QtCore from PyQt4 import QtGui from PyQt4 import QtSql import sys import at
  • QT 中只获取文件而不获取目录?

    当我这样做时 QDir myDir home some location QStringList filesList myDir entryList 它返回该位置内的文件和目录 但我只想要文件 并且这些文件可以具有任意扩展名 有任何想法吗
  • Qt 支持在 QIcon 中为 SVG 着色

    看来 Qt 不支持 SVG 中路径标签上的描边 填充选项
  • QTableView 中的虚拟列?

    我开始学习 Qt4 模型 视图编程 我有初学者问题 我有一个简单的应用程序 其中显示 sqlite 表QTableView class Model QtSql QSqlTableModel def init self parent None
  • Qt程序部署到多平台,如何?

    我是 Qt 编程新手 我想开发一个程序 我想在 Windows Linux ubuntu 和 Mac 上运行 听说Qt支持多平台应用程序开发 但我的问题是 在我部署或编译后 任何 Qt 库都需要在 Ubuntu 中运行这个应用程序吗 如果您
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • Qt中如何获取鼠标在屏幕上的位置?

    我想获取屏幕上的鼠标坐标 我怎样才能在 Qt 中做到这一点 在 Windows 上 使用 C 我正在做类似答案中建议的事情对于这个问题 https stackoverflow com q 11737665 1420197 正如文档所述 QC

随机推荐

  • 【数据库MySql】数据库基础——库和表的基础操作

    数据库学习大纲 1 SQL编程语言的语法 核心 2 数据库内部原理 面试题 3 使用java代码操纵数据库 JDBC编程 SQL是一个专门用来操作数据库数据的编程语言 MySQL服务器里面里有很多个数据库 这些是逻辑上的数据集合 一个数据库
  • CSAPP-BinaryBomb实验

    目录 一 实验目的与要求 二 实验原理与内容 三 实验过程与结果 1 程序编码 汇编 2 拆解过程 Phase 1 Phase 2 Phase 3 Phase 4 Phase 5 Phase 6 Secret phase 一 实验目的与要求
  • IOException parsing XML document from class path resource [applicationContext.xml]

    在spring框架搭建的时候 有的时候会出现这样错误 在网上看到说把路径具体指向 例如
  • ESP8266WIFI模块连接原子云及手机APP

    一 项目需求 使用ESP8266WIFI模块连接到正点原子的原子云 下载原子云手机APP到安卓手机 使用APP与8266WIFI模块通信互发数据 二 软硬件准备 硬件 1 正点原子的esp8266模块 2 usb to ttl 模块 软件
  • 详解Namespace与资源限制ResourceQuota,LimitRange

    前面我们对K8s的基本组件与概念有了个大致的印象 并且基于K8s实现了一个初步的CI CD流程 但对里面涉及的各个对象 如Namespace Pod Deployment Service Ingress PVC等 及各对象的管理可能还缺乏深
  • 云计算、大数据、人工智能的区别

    一 什么是人工智能 通俗来说 利用计算机及其相关设备来模拟和实现人类或者是智能生物的思想和行为 从而达到更彻底地代替人类进行生产活动 就是人工智能 人工智能有很多学派和技术路线 多以数学理论为工具 比如统计学 线性代数和概率论等 它聚焦于解
  • ENVI5.1 进行监督分类流程化工具时(classification workflow)界面显示不全的问题解决办法

    在使用ENVI5 1进行监督分类流程化工具时 classification workflow 会存在界面显示不全的如下问题 需要下载ENVI5 1的一个界面补丁 补丁下载链接 https pan baidu com s 1DHqd6wHDI
  • 数据库、sql、语句表、存储引擎、集成开发工具讲解、MySQL中的数据类型

    一 2 为什么要学习数据库 2 1上述技术适合小量数据 对于大量数据操作 性能低下 2 2上诉技术存储数据的技术有java语言提供 不够专业 3 数据库概述 3 1核心 数据管理 3 2方式CRUD 1 存 增删改 2 取 查 查所有 指定
  • 时间序列的分析及滚动预测代码

    注意 参考地址http www cnblogs com foley p 5582358 html 部分代码可能因为版本问题出现bug 什么是时间序列 时间序列简单的说就是各时间点上形成的数值序列 时间序列分析就是通过观察历史数据预测未来的值
  • Android开发基础

    基本知识 Android 是一个面向移动设备的软件堆层 包含了一个操作系统 中间件和关键的应用程序 每个 Android 应用程序都通过 Dalvik 虚拟机在自己的进程中运行 Android 应用程序是用 java 语言写的 通过 aap
  • vb.net 随窗口改变,缩放控件大小以及保持相对位置

    Public Class Form1 Dim originClienSize As Size Nothing Dim originBtnSize As Size Dim originBtnPos As Point Private Sub F
  • 【目标检测】12、TOOD: Task-aligned One-stage Object Detection

    文章目录 一 背景 二 动机 三 方法 3 1 Task aligned Head 3 2 Task Alignment Learning 3 2 1 Task aligned sample assignment 3 2 2 Task al
  • 宝塔忘记密码了咱们办?找回宝塔密码

    很多朋友使用宝塔管理自己的服务器 但是有时改完密码不小心忘记保存 自己点忘记密码找回时发现了一大堆让技术小白看的懵逼的教程 其实不用那么麻烦 下面我就给大家说一个只要一分钟就能立即找回你宝塔面板密码的方法 要记住我们千万不要去点击右下方的忘
  • 【程序语言】-- 编程语言分类和应用

    系列文章目录 文章目录 系列文章目录 前言 一 编程语言有哪些 二 应用概况 1 Python 2 Java 3 C C 4 JavaScript 5 Golang 6 R 7 Swift 8 PHP 9 C 9 MATLAB 总结 前言
  • qt项目中连接sqlserver数据库失败

    原因sqlserver网络配置中的TCP IP协议被禁用 开启之后电脑重启即可正常连接
  • windows安装CUDA/cuDNN

    零 安装包的官方链接 1 CUDA Toolkit Archive https developer nvidia com cuda toolkit archive 2 torch https download pytorch org whl
  • 工作了17年,2021年双11是我见过有史以来“撸腾讯云羊毛”最狠的一次,血赚

    工作了17年 2021年双11是我见过有史以来 撸腾讯云羊毛 最狠的一次 血赚 我为什么强烈推荐我的粉丝一定要有一台自己的服务器 1 可以放自己的资料 走到哪里都不怕丢文件 一键上传 多爽 速度还快 2 可以部署一个自己唯一的博客网站 1
  • 解决idea中properties配置文件显示中文乱码

    1 问题 用idea打开 properties的配置文件 所有的中文注释都出现了乱码 2 解决方法 idea中在file gt setting gt editor gt file encodings下 把编码格式都设置为UTF 8 并且把t
  • svn实现容灾备份

    Svn的容灾备份和数据恢复 环境声明 这里采用svn的镜像备份 搭建SVN在我的上一篇博客中 搭建部署SVN服务器 源版本路径 svn 192 168 244 134 ceshi 镜像版本 ip 192 168 244 132 建立镜像版本
  • Qt 信号与槽的各种连接方式

    作者 billy 版权声明 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 简介 信号槽是 Qt 框架引以为豪的机制之一 当用户触发某个事件时 就会发出一个信号 signal 这种发出是没有目的的 类似广播 如果有对象对