QT信号槽连接方式

这篇具有很好参考价值的文章主要介绍了QT信号槽连接方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.QT信号槽主要分两个连接方式,手动和自动:
1.1 使用 connect() 函数手动连接信号和槽:
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
自动:
1.2 使用 lambda 表达式连接信号和槽:
connect(sender, &Sender::signal, ={
receiver->slot();
});
1.3 通过使用 QMetaObject::connectSlotsByName() 函数自动将部件中以 on_ 开头命名的槽函数与其对应的信号相连接。例如,在设计窗口中选择一个按钮,并在属性编辑器中设置其 objectName 属性为 “myButton”,然后定义一个 on_myButton_clicked() 槽函数,该函数将自动连接到该按钮的 clicked() 信号上。
2.connect()函数的五种连接方式,一次连接,终身调用,除非disconnect。

enum ConnectionType {
	AutoConnection,//默认
	DirectConnection,//立即调用
	QueuedConnection,//放在接收者队列
	BlockingQueuedConnection,//与放在接收者队列,同时阻塞发送者
	UniqueConnection =  0x80//标志位,避免重复链接
};

connect()函数原型如下:

[static] QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

2.1 Qt::AutoConnection(默认)
根据 sender 和 receiver 两者所在线程,当信号发出时作出判断。同一线程则 Qt::DirectConnection 连接,否则使用 Qt::QueuedConnection 连接。容易产生误区的点:不是sender的所属线程,而是真正触发了emit 信号的动作线程。

Qt::DirectConnection
无论sender和receiver是否在同一线程,都会立刻调用槽函数,最简单的理解成把一段代码“临时插入”到了运行栈,所以在多线程情况下非常危险,必须做好线程同步。

Qt::QueuedConnection
sender的信号会被压入到接收者的事件循环中,所以不会立即调用。而是等到当接收者对象处理其自身的消息队列时,再针对消息队列中的这个信号进行处理。可以说就是为了开发者解决跨线程通信而设计的。当然你也可以用于同一个线程不同对象,这种相同线程的强行指定队列方式通常都会和GUI的模态窗有关。

Qt::BlockingQueuedConnection
Blocking+QueuedConnection,他的槽函数运行时机与QueuedConnection是一致的。那Blocking的意义是什么?就是阻塞发送者!直到槽函数运行完毕再继续执行。源码上相比QueuedConnection的实现多加了一个等待输入的信号量QSemaphore,所以一旦接收者和发送者在同一线程,那就会发生死锁。

Qt::UniqueConnection
这个其实严格上来说相比上面四种方式并不算新的连接方式,而是用于修饰上面的四种连接方式。他实现的效果就是避免重复连接,因为Qt的信号槽是可以同一个信号和槽函数重复多次连接。这种通常都会是只执行一次就好,那就通过这个标志位进行修饰,达到多次连接(实际上也只是连接了一次)也只调用一次槽函数的效果。用(Qt::ConnectionType|Qt::UniqueConnection)来修饰。

connect(ui->btn_close, &QPushButton::clicked, this, &QWidget::close,Qt::DirectConnection|Qt::UniqueConnection)

3.线程类中槽函数在哪个线程中执行的问题
由于线程本身就是通过信号/槽函数进行处理的,所以他们执行的线程相同,槽相应顺序可以通过第五参数设置。
具体需要参考,connect函数中表示连接方式得参数
如下:
同步调用:信号发出后,当前线程等待槽函数执行完毕才能执行剩余代码。
异步调用:信号发出后,立即执行剩余逻辑,不关心槽函数什么时候执行。
AutoConnection 信号和槽同一线程时,直接调用,不同线程时,队列调用;
DirectConnection 发送消息后立即调用槽函数;
QueueConnection 发送后插入队列,按照线程消息队列调用;
BlockingQueuedConnection 阻塞联,同步调用, 槽函数在次线程中执行,用信号量实现阻塞,
槽函数所在对象得线程必须启用QT事件循环,此连接只能用于发出信号得线程和槽函数执行线程不同得情况。
要么在发射信号得线程中执行要么在接受者依附得线程中执行文章来源地址https://www.toymoban.com/news/detail-651511.html

到了这里,关于QT信号槽连接方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT+OpenCV实现一个标注工具(图像处理、边缘检测)

    作者是一名QT初学者,为检验学习成果及完成毕业设计,在张老师和学姐的指导下,开发了这个标注工具。CSDN上很多文章对我的学习提供了极大的帮助,分享这篇文章给需要的人一起学习进步~ 废话不多说,先看看效果: Windows10、Qt5.13.2(编译器用的是MinGW64_bit)、OpenCV4.1 环

    2024年02月11日
    浏览(34)
  • 【Qt】信号槽的三种连接方式

    实现观察者模式,可以使用函数回调,但注册回调函数有一定局限,安全性也没有保证。所以一定程度上可以说 Qt 信号槽是对回调机制进行了封装。 Qt 的信号槽能够连接(connect) 和编译通过,需要满足两个条件 信号的参数个数大于等于槽函数 信号槽的参数个数相同的部分,

    2024年02月13日
    浏览(34)
  • 【QT课程设计】五:部分内容修正、利用opencv读入视频并进行部分图像处理

    导航索引帖 前置文章,课设第四篇 上篇文章中,我们基本完成了图片处理的相关功能要求,本文章将会对前文的一些错误进行修正,并且开始视频部分。 =。=最近博客的更新因为看世界杯耽误了很多,这篇文章打算一次性更新多些内容。 错误描述 前文中,我们并没有考虑到

    2024年02月02日
    浏览(30)
  • Qt6入门教程 8:信号和槽机制(连接方式)

    目录 一.一个信号与槽连接的例子 二.第五个参数 1.Qt::AutoConnection 2.Qt::DirectConnection 3.Qt::QueuedConnection 4.Qt::BlockingQueuedConnection 5.Qt::UniqueConnection 三.信号 四.connect函数原型 五.信号与槽的多种用法 六.槽的属性 在调用a.setValue(12)时会发送valueChanged(12)信号,此时槽函数b.setValue(12)会

    2024年01月17日
    浏览(46)
  • QT中信号与槽机制的介绍,以及信号与槽连接的几种方式

    功能:实现多个组件之间的相互通信,是QT引以为傲的核心机制 信号:就是信号函数,定义在类体的signals权限下,是一个不完整的函数,只有声明没有定义; 槽:就是槽函数,定义在类体的slots权限下,是一个完整的函数,既有声明也有定义,也可以当做普通函数被使用 无

    2024年02月10日
    浏览(34)
  • 数字信号与图像处理实验三:图像处理基础与图像变换

    ​ 通过本实验加深对数字图像的理解,熟悉MATLAB中的有关函数;应用DCT对图像进行变换;熟悉图像常见的统计指标,实现图像几何变换的基本方法。 ​ 选择两幅图像,读入图像并显示,同时使用Matlab计算图像的大小,灰度平均值、协方差矩阵、灰度标准差和相关系数。 DC

    2024年02月04日
    浏览(46)
  • Qt 多线程、信号和槽连接方式推荐connect(Sender,Singnal,Receiver,Slot,ConnectMode);如下图所示

    connect(主线程A,信号A,子线程B,槽函数B,DirectConnection /AutoConnection ); connect(子线B,信号B,主线程A,槽函数A,QueueConnection  );

    2024年02月13日
    浏览(26)
  • 图像构成与信号处理之三——图像滤波

    图像滤波是一种常见的图像处理技术,用于平滑图像,去除噪声和边缘检测等任务。其工作的原理是通过提前设定 滤波器 ,将滤波器作用与原图像,得到拥有需要的滤波效果的图像。 一般图像滤波分为 平滑类:均值滤波 ; 去噪类:中值滤波 ; 突出边缘:双边滤波 ;等。

    2024年03月17日
    浏览(66)
  • 人工智能在图像处理领域的应用

    随着科技的不断发展,人工智能(AI)逐渐成为当今社会的热点话题。人工智能正在逐渐渗透到人类生活的各个领域,改变着我们的生活方式和社会结构。在图像处理领域,人工智能的应用也越来越广泛,为图像处理带来了更高效、更准确的解决方案。本文将从图像分类、图

    2024年02月04日
    浏览(40)
  • oneAPI人工智能分析工具包实现图像处理

    oneAPI是一个由英特尔(Intel)主导的、面向异构计算的开放标准和平台。它旨在简化和加速跨多种硬件架构的应用程序开发,包括CPU、GPU、FPGA和其他加速器。 以下是关于oneAPI发展的一些要点: 1.创立背景和目标: oneAPI的发展始于英特尔意识到在异构计算时代,开发者面临的

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包