首页 > 其他分享 >Qt 中信号槽的连接方式总结

Qt 中信号槽的连接方式总结

时间:2024-04-07 17:57:38浏览次数:26  
标签:总结 函数 发送者 线程 信号 连接 Qt

Qt 中信号槽的连接方式,即: QObject::connect() 函数的第五个参数 Qt::ConnectionType,共有五种连接方式。 它决定了是否立刻将特定的信号传递给槽函数,还是将其放在队列中,稍后进行传递。

1. Qt::AutoConnection :自动连接(默认方式)

当第五个参数缺省时默认为该连接方式。具体为:当接收者和发送者位于同一个线程时,等于Qt::DirectConnection;当接收者和发送者位于不同的线程时,等于Qt::QueuedConnection。选择哪一种取决于信号何时被触发。

2. Qt::DirectConnection:直接连接

该方式表示,当信号被触发时,槽函数立刻被调用。 信号的发送和槽函数的执行位于同一个线程中。

3. Qt::QueuedConnection:队列连接

该方式表示:当控制权回到接收者所在线程的事件循环时,槽函数才会被调用。槽函数在接收者所在的线程中执行。在这个过程中信号的发送者和接受者不在同一个线程中,所以发送的信号要先存放于队列中,等到控制权回到接收者所在的线程时,才会在该线程中来执行对应的槽函数。

4. Qt::BlockingQueuedConnection:阻塞连接

该方式与 Qt::QueuedConnection 相同,唯一不同的地方是:发送信号的线程会阻塞,来等待对应的槽函数执行结束,直到槽函数返回,才会继续往下执行。当信号的发送者和接受者位于同一个线程时,禁止使用该连接方式,否则程序会出现死锁。
该连接的一个使用场景是,当需要通过一个GUI程序来启动另一个窗口时,可以先判断当前的线程是否为主线程(即 GUI线程),如果当前线程为GUI线程中,则可以直接像调用普通函数一样来调用对应的槽函数,否则需要通过信号槽的方式来触发对应的信号,等待槽函数在另一个线程中来执行。

QObject::connect(this, &MyObj::SigInfo, this, &MyObj::SlotFunc, Qt::BlockingQueuedConnection);

if(QThread::currentThread() == qApp->thread())
{
    // 当信号在主线程中被触发时,直接调用槽函数
    this->SlotFunc();
}
else
{
    // 当触发信号的时机和槽函数的执行不在一个线程中时,需要通过信号槽的方式来进行触发。
    emit SigInfo();
}

5. Qt::UniqueConnection:唯一连接

该方式表示:信号的发送者和接收者之间只能建立一个连接,如果信号的发送者和接受者之间已经建立了连接,则后续针对该发送者和接收者的任何连接 QObject::connect() 将会失败。且该方式可以和以上四种连接方式的任意一种通过 位或('|') 进行组合使用。

标签:总结,函数,发送者,线程,信号,连接,Qt
From: https://www.cnblogs.com/Jeffxu/p/18119574

相关文章

  • SpringBoot集成mqtt启动就不断报已断开连接问题
    踩坑记录,实在是天坑!!!原因一:clientId相同,即clientId重复导致(不过我不是这个问题)我的问题是:项目启动成功后,控制台不停地反复输出:已断开连接,,,加了重连机制后,则不停地输出:重连失败,已连接客户机,,,尼玛,,关键点还在于我能接收到订阅的消息(不影响消息处理),这又是什么情况,明明没断连,确一直......
  • TOPCODER时期训练赛小总结
    20240407模拟赛T1TurnOnLamps直接树上dp维护子树内是否有路径在根节点处停止的最小操作数\(O(n)\)维护即可,数据范围纯sbT2XorCards线性基或高斯消元板子,高斯消元比较好想。可以枚举大于等于时前若干位是相同的,然后直接搞出限制消元即可。时间复杂度合理。线性基则非常......
  • MQTT 错误码 说明
    //成功#defineMQTTCLIENT_SUCCESS0 //失败,通用#defineMQTTCLIENT_FAILURE-1 //客户端未连接,未连接,先使用引起#defineMQTTCLIENT_DISCONNECTED-3 //已达到允许同时处理的最大消息数(#defineMAX_MSG_ID65535)#defineMQTTCLIENT_MAX_MESSAGES_INFLIGHT-4 //UTF-8字......
  • 高项(6)-常考论文预测-案例记忆技巧总结-非常经典便于记忆
    4、常考预测-论文-记忆论文写作-范围输入、输出、工具和技术范围管理计划内容(如何做范围定义的)(写在规划范围管理计划)范围确认、范围控制区别活动和工作包的关系(写在创建wbs里面)wbs、分解步骤wbs分解原则如何控制范围基准问题、原因、解决如何防止范围蔓延,范围变更流程、......
  • Tailwind写法总结
    在使用TailwindCSS编写类时,通常按照以下一般顺序排列类,以确保代码的清晰性和易读性:定位类:包括控制元素位置的类,如absolute,relative,fixed,static,sticky等。盒模型类:包括控制元素内边距、外边距、宽度和高度的类,如p-,m-,w-,h-等。背景类:包括控制元素背景颜色、......
  • VS+QT 创建UI界面自动生成.h和cpp文件
    1.创建QT窗口界面创建内容:qtwidgetClass:创建.UI文件以及对应的窗口类文件,其余的只创建ui文件,记一笔免得又忘记了自己填写类名称,选择基类,完成创建就好 ......
  • 远程连接与Linux基础使用指南
    1.远程连接与Linux基础使用指南1.远程连接排错详解1.0 Vmware小技巧挂起:把正在运行的虚拟机暂停,这样好处就是虚拟机不用关机。快照:给虚拟机当前状态拍摄一个保存节点,这个保存的节点可以用于恢复。可以在开机,挂起,关机状态拍摄。1.1现象关键提示:Connectionfaile......
  • qt Qml qml Property的使用方法
    9.property简介:自己声明一个变量名,自己赋值,外部可以对其赋值可以声明一个属性变量intstringvardouble等等也可以声明一个控件用于外部写入到本qmlrectanglecomponent等等其他:在property前面可以加readonly就可以只能外部访问,不能修改在property前面可以加req......
  • qt Qml qml MouseArea的属性和信号方法
    Mousearea属性:​acceptedButtons:​接受的鼠标按键,默认是左键Qt.LeftButton|Qt.RightButton|Qt.AllButtons等等​pressedButtons:​按下的是什么键?左键or右键等Rectangle{color:"yellow"anchors.centerIn:parentwidth:200hei......
  • KEPServerEX V6 OPC UA连接指导
    一、KEPServeEX作为OPCUAServer:以UaExpert作为OPCUAClient 程序测试本地连接1.打开KEPServerEXConfiguration,配置需要采集的通道设备以及标签,本例以simulator变量标签为例,创建一个simulator驱动设备。   自定义通道和设备名称,其他全部默认即可,创建完......