`
izuoyan
  • 浏览: 8942995 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Qt中连接到同一signal的多个slots的执行顺序问题

 
阅读更多
  • in the order they have been connected

起源

前些天忘记在哪儿讨论过这个问题,今天在csdn又看到有网友问这个问题,而其他网友却无一例外的给出了“无序”这个答案。

Manual

Qt的问题,当manual中有明确文字说明时,我们应该以Qt的manual为准:

http://doc.qt.nokia.com/4.8/signalsandslots.html

If several slots are connected to one signal, the slots will be executed one after the other, in the order they have been connected, when the signal is emitted.

或者http://doc.qt.nokia.com/4.8/qobject.html

If a signal is connected to several slots, the slots are activated in the same order as the order the connection was made, when the signal is emitted.

恩,说的很明确,各个槽按照被connect的顺序被执行【注意,在队列模式时,是指相应的事件被post,仍不保证槽被按照该顺序执行】。

可是,为什么很多人认为是无序呢?(除了前面提及的,还有什么其他因素么?)

翻翻Qt4.5以及该版本之前的manual,可以看到

http://doc.qt.nokia.com/4.5/signalsandslots.html

If several slots are connected to one signal, the slots will be executed one after the other, in an arbitrary order, when the signal is emitted.

以及http://doc.qt.nokia.com/4.5/qobject.html

If a signal is connected to several slots, the slots are activated in an arbitrary order when the signal is emitted.

网络上以及书籍中的大部分资料都是Qt4.6之前的,故尔 ...

源码

恩,尝试看过元对象系统这部分源码的网友对这部分不会觉得陌生。如果没看过,可以瞅瞅这个Qt Meta Object system 学习(三)

  • QObject::connect() 最终将 信号和槽的索引值放置到一个Connection列表中

QObjectPrivate::Connection *c = new QObjectPrivate::Connection; 
    c->sender = s; 
    c->receiver = r; 
    c->method = method_index; 
    c->connectionType = type; 
    c->argumentTypes = types; 
    c->nextConnectionList = 0; 
QObjectPrivate::get(s)->addConnection(signal_index, c); 
  • 信号的发射,就是借助QMetaObject::activate() 来依次处理前面那个Connection列表总的项

do { 
        QObjectPrivate::Connection *c = connectionLists->at(signal_index).first; 
        if (!c) continue; 
        // We need to check against last here to ensure that signals added  
        // during the signal emission are not emitted in this emission. 
        QObjectPrivate::Connection *last = connectionLists->at(signal_index).last;
 
       do { 
            if (!c->receiver) 
                continue; 
             QObject * const receiver = c->receiver;

在该过程中:

  • 如果是直接连接,则通过 QMetaObject::metacall() 直接调用
  • 如果是队列连接,则post一个QMetaCallEvent事件,稍后通过事件派发,该事件的处理函数负责通过 QMetaObject::metacall() 调用相应的槽函数【注意,小心此时槽函数的执行顺序】

注意:此处的代码片段是Qt4的,而Qt5.0 中由于引入了新式的信号和槽语法,对应部分源码有较大变化。

参考


分享到:
评论

相关推荐

    QT多线程技术读取文档内容到程序里

    利用QT Creator多任务读取一个文档到程序里 为了防止直接读取文件里的内容太大而发生卡顿,于是多线程读取将更高效的解决这个问题。 效果图如下: 其中pro文件无需改动,默认就好,头文件h里面的内容为 #ifndef...

    基于QT 校园图书管出入库系统.zip

    Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API Qt包括多达 250 个以上的 C++ 类,还提供基于模板的 collections, serialization, file,...

    解决vue同一slot在组件中渲染多次的问题

    Q:今天写公共组件的时候碰到一个奇葩的情况,slot内部需要再次调用slot,这...以上这篇解决vue同一slot在组件中渲染多次的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。

    qtdesigner sqlite qt

    Qt is designed to be pleasant and intuitive to hand-code, and it is perfectly possible to develop Qt applications purely by writing C++ source code. Qt Designer expands the options available to ...

    qt工厂模式例子qt简单工程模式源码

    参考如下博客,亲自实践了一个QT的工厂模式,亲测可用,编译运行实测。 我用qt5.6,在windows下编译并运行测试,正常。 https://blog.csdn.net/baidu_33570760/article/details/71159808 1. Qt工厂模式源码 2. C++...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    slots editor 中进行信号和槽的关联,其中,Sender 设为enterBtn,Signal 设为clicked(),Receive 设为myDlg,Slot 设为accept()。这样就实现了单击 这个按钮使这个对话框关闭并发出Accepted 信号的功能。下面我们将...

    QT使用注意

     2) 当某个信号关联到不同的槽函数时,不同槽执行的顺序是按照建立某信号时的顺序;  3) 信号只能声明且无返回值,此外由关键字signals指定,也不可有其他修饰限定符如public、static等;  4) 发射信号用emit...

    Qt中的线程

    QThread东西还是比较多的 而且我对底层对象了解有限 仅就一点进行展开 或许是大家最关心的一点 :QThread中的slots在那个线程中执行

    QT完整自学例程序demo

    Qt 是一种更快,更智能的方式来为多个屏幕创建创新的设备、现代用户界面和应用程序。它是一个跨平台的 C++ 应用程序开发框架。它提供给开发者建立图形用户界面所需的功能,广泛用于开发图形用户界面程序,也可用于...

    qt开发入门介绍.zip

    Qt开发入门主要包括以下几个方面的介绍: Qt概述: Qt是一个跨平台的C++应用程序开发框架,由Qt Company(前身为Nokia)开发。它支持Windows、macOS、Linux、Android和iOS等多个操作系统。 Qt框架提供了丰富的功能...

    C++课设:基于Qt开发的一个期刊管理系统.zip

    Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API Qt包括多达 250 个以上的 C++ 类,还提供基于模板的 collections, serialization, file,...

    C++毕业设计:基于Qt的多线程局域网聊天系统(含客户端+服务端).zip

    Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API Qt包括多达 250 个以上的 C++ 类,还提供基于模板的 collections, serialization, file,...

    C语言GUI学习项目:基于C++&Qt编写的一个简易计算器和打车计费系统.zip

    Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API Qt包括多达 250 个以上的 C++ 类,还提供基于模板的 collections, serialization, file,...

    毕业设计:基于QT的人脸识别,定位导航,脑电心率测算,用GPRS传到服务端的疲劳驾驶检测系统.zip

    Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API Qt包括多达 250 个以上的 C++ 类,还提供基于模板的 collections, serialization, file,...

    基于C++ &QT的学生选课系统.zip

    Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API Qt包括多达 250 个以上的 C++ 类,还提供基于模板的 collections, serialization, file,...

    基于Qt GUI c++ 开发的记账系统.zip

    Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API Qt包括多达 250 个以上的 C++ 类,还提供基于模板的 collections, serialization, file,...

    C++课设作业:Qt影院管理系统.zip

    Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API Qt包括多达 250 个以上的 C++ 类,还提供基于模板的 collections, serialization, file,...

    基于C++和 Qt 的影院票务系统.zip

    Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API Qt包括多达 250 个以上的 C++ 类,还提供基于模板的 collections, serialization, file,...

    基于MySQL和Qt的医疗预约系统.zip

    Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API Qt包括多达 250 个以上的 C++ 类,还提供基于模板的 collections, serialization, file,...

    毕设项目:基于QT+yolov5s的缺陷检测系统,包括图像检测以及目标检测两个部分.zip

    Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API Qt包括多达 250 个以上的 C++ 类,还提供基于模板的 collections, serialization, file,...

Global site tag (gtag.js) - Google Analytics