首页 > 其他分享 >QT 信号槽要点

QT 信号槽要点

时间:2023-06-28 17:22:05浏览次数:29  
标签:clicked 函数 button 线程 信号 要点 Qt QT

QT 一次触发执行两次槽函数的问题
一、QT 信号槽第五个参数的一些基本概念:

1、Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。

2、Qt::DirectConnection:槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用了槽函数。这个在多线程环境下比较危险,可能会造成奔溃。

3、Qt::QueuedConnection:槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个。

4、Qt::BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。

5、Qt::UniqueConnection:这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接。

在Qt开发中,有两种情况能够触发槽函数被触发两次,第一种情况是必现的,属于错误的写法,是指信号和槽关联两次;第二种情况是偶然出现的,是指对信号没有正确理解导致的。

 

 

1.信号与槽关联两次

通常这种情况下发生在混合编程的情况下,即既使用了UI来进行布局,又使用来代码来关联信号,使得信号和槽关联两次。不妨以QPushButton中的button为例,通常在使用ui文件布局中自动生成的文件中会调用这样一句话:

QMetaObject::connectSlotsByName();
这样则代表隐式调用connect(button, &QPushButton::clicked, this, &myWidget::on_button_clicked);此时开发者只需要实现on_button_clicked即可,如果再在代码中显示添加信号和槽连接,则会触发槽函数两次

 

2.QPushButton中的pressed,released, clicked信号

通常这种情况发生在对信号的关联上,以QPushbutton为例,其他的如果有类似情况可以延伸,首先复现这种场景需要正确理解QPushButton中的三种信号:pressed指的是鼠标左键按下的动作,released指的是鼠标左键抬起的动作,clicked指的是鼠标左键按下并抬起的动作,因此触发优先级为pressed>released>clicked.

考虑场景,关联pressed信号,测试鼠标快速点击button,点击button关闭对话框并打印进入对话框的次数,测试发现:在多次尝试后,会出现概率性的一次点击,进入两次对话框的情况,但是关联clicked信号却不会出现这种情况。

避免情况:因此,如果不需要区分三种信号触发的优先级,建议在开发过程中尽量使用clicked信号。

标签:clicked,函数,button,线程,信号,要点,Qt,QT
From: https://www.cnblogs.com/7star/p/17511985.html

相关文章

  • C++学习---qt的公有类、私有类、Q_Q、Q_D、二进制兼容
    1、二进制兼容如果程序从一个以前版本的库动态链接到新版本的库之后,能够继续正常运行,而不需要重新编译,那么我们就说这个库是二进制兼容的。如果不能保证库的二进制兼容性,就意味着每次发布库的新版本时,依赖该库的所有程序都必须重新编译才能正常运行。2、公有类、私有类是解决......
  • Qt界面坐标
    x:左上角距屏幕左上角的水平距离y:左上角距屏幕左上角的竖直距离geometry几何属性:整个窗体的属性用frameGeometry(),客户区的属性用geometry()。#include"QtWidgets0628.h"#include<QtWidgets/QApplication>#include<qdebug.h>intmain(intargc,char*argv[]){QAp......
  • QT性能优化实战 QML优化 QT高性能 QT6系列视频课程 QT6 性能优化实战 QT高性能 QT原理
      QT性能优化实战视频课程QT6Widgets高性能应用编程 1.课前考试2.字符串优化(上)3.字符串优化(下)4.绘图优化(上)5.绘图优化(下) 6.QT界面优化(上)7.QT界面优化(下)8.QT高性能统计图优化 9.QT高性能图形视图图元场景优化......
  • pyqt5:自定义信号实现/pyqt 打开网页/app.exec_()
    1、自定义信号  2、pyqt打开网页importwebbrowserwebbrowser.open('https://www.zhihu.com/question/23711222')3、app.exec_()与sys.exit(app.exec_())区别:app.exec_()#等待app主循环结束的,并在结束后执行后面行的程序#sys.exit(app.exec_())#起到等待主循环结束......
  • pyqt5:槽函数里加线程
    参考:(17条消息)PyQt5在textBrowser添加文本并自动滑动到底_pyqt5textbrowser_SQZHAO的博客-CSDN博客   ......
  • 如何解决MQTT消息积压
    什么是消息积压?大量消息被堆积在broker端,没有被消费。为什么会消息积压?宏观角度主要原因是:producer端生产速度>consumer端消费速度。导致producer端生产速度>consumer端消费速度的情况有多种:设计的时候就没有考虑消费速度要大于生产速度,这种情况最不应该。某一时刻......
  • VS开发Qt界面项目—— 一些注意事项
    1、VS新建Qt项目时,ui使用指针、类名保持VS习惯首字母大写2、将ui_*.h文件添加进项目(项目\x64\Debug\uic\ui_*.h),以便ui->智能提示。 3、设置VS里双击ui文件直接用QtCreator打开,而不是QtDesigner。VS解决方案ui文件处,鼠标右键,打开方式(N)... 4、防中文乱码。main.cpp中......
  • Qt QString 转换 Html 实体
    开发环境:Qt5.12.2+QtCreator1、问题背景:读取日志在QTextBrowser显示中使用HTML设置显示颜色,如果日志内容中存在HTML相关关键字符,会导致显示异常2、问题显示:ui->textBrowser_LogText->append("<fontcolor=\"#666666\">"+log+"</font>");数据遇......
  • python: pyQt5
    pipinstallPyQt5pipinstallPyQt5-toolshttps://www.w3schools.cn/pyqt5/pyqt5_hello_world.htmlhttps://doc.qt.io/qtforpython-5/contents.htmlhttps://zhuanlan.zhihu.com/p/162866700https://blog.csdn.net/youcans/article/details/120925109https://zhuanlan.zhihu.......
  • 可穿戴多通道生理信号采集数据分析演示
    一前记基于ads129x系列的多通道生理信号采集设备的研发终于告一段落了。最近使用信号发生器测量了一下波形,发现信号质量还是非常不错的,甚至欣慰。做一个留念吧。二波形展示信号发生器发出了的方波信号,采集到的信号如下所示: 信号发生器发出了的正选波......