Qt中信号槽connect的多种类型

QObject::connect只有4个参数吗?其实不是,请看它的定义:QObject::connect(sender, signal, receiver, method, Qt::ConnectionType type = Qt::AutoConnection)可见实际它有5个参数,只是最后一个参数有默认值,所以平常使用时很少触及。前4个参数都很熟悉,第五个参数是一个enum Qt::Connection Type类型的,它一共有六个值,下面是Qt Assistant中给出的明确说明:

This enum describes the types of connection that can be used between signals and slots. In particular, it determines whether a particular signal is delivered to a slot immediately or queued for delivery at a later time.

Constant Value Description
Qt::AutoConnection 0 (default) Same as DirectConnection, if the emitter and receiver are in the same thread. Same as QueuedConnection, if the emitter and receiver are in different threads.
Qt::DirectConnection 1 The slot is invoked immediately, when the signal is emitted.
Qt::QueuedConnection 2 The slot is invoked when control returns to the event loop of the receiver‘s thread. The slot is executed in the receiver‘s thread.
Qt::BlockingQueuedConnection 4 Same as QueuedConnection, except the current thread blocks until the slot returns. This connection type should only be used where the emitter and receiver are in different threads. Note: Violating this rule can cause your application to deadlock.
Qt::UniqueConnection 0x80 Same as AutoConnection, but the connection is made only if it does not duplicate an existing connection. i.e., if the same signal is already connected to the same slot for the same pair of objects, then the connection will fail. This connection type was introduced in Qt 4.6.
Qt::AutoCompatConnection 3 The default type when Qt 3 support is enabled. Same as AutoConnection but will also cause warnings to be output in certain situations.

时间: 2024-10-08 17:50:23

Qt中信号槽connect的多种类型的相关文章

非Qt工程使用Qt的信号槽机制

非Qt工程,使用Qt的信号槽机制,蛋疼不?反正我现在就是要做这样一件蛋疼的事. 要使用Qt的信号槽机制,下面是从Qt Assist里面关于 signal & slots 的一句介绍: All classes that contain signals or slots must mention Q_OBJECT at the top of their declaration. They must also derive (directly or indirectly) from QObject.

qt中信号与槽机制

一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁. 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信. 信号 当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号.这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用. 槽 用于接收信号,而且槽只是普通的对象成员函数.一个槽并不知

QT信号槽connect的第五个参数

用过QT的小伙伴都知道连接信号槽的connect方法,但是这个方法有第五个参数,一般都是用的默认的 connect(th,SIGNAL(started()),tmpmyobject,SLOT(showID())); 今天给大家讲讲第五个参数的用法 1.Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定.如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型.如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConne

在非UI线程中更改UI(Delphi使用隐藏窗口来处理,QT使用信号槽)

在Delphi里我记得是使用TThread.Synchronize(TThreadMethod),原理是利用了一个隐藏窗口来处理. 在QT Debug模式一下,碰到了同样的问题,显示错误: cannot send events to objects owned by a different thread 解决方案是使用信号槽,就是在线程里不断的发信号,UI线程的槽函数不断的接受信号并做处理: So as a solution I would propose the following: Defi

Qt之信号槽连接——基于字符串与基于函数的连接之间的不同(译)

从Qt5.0开始,Qt提供了两种不同的方式进行信号槽的连接:基于字符串的连接语法.基于函数的连接语法.这两种连接语法各有利弊,下面的表总结了它们的不同点. 下面几部分详细解释了它们之间的不同,并且说明对于每种连接语法如何使用各自的优点. 类型检查以及隐式类型转换 基于字符串的连接是在运行时通过字符串比较来进行类型检查,这种方式有3个局限性: 1.只有在程序运行后才能查出连接错误: 2.信号和槽之间不能进行隐式转换: 3.类型定义和名字空间不能被识别. 第2第3个局限存在的原因是,字符串的比较并不

Qt的信号槽,一个老MFC的经验

最近在利用闲暇时间研究Qt,大概有3周了,看过了官网的white paper并浏览了一遍<C++ GUI Programming with Qt 4, 2nd Edition>.总的来说,感触还是很深的,所以今天想写点东西,作为对Qt初体验的记录. 本人作为一个MFC老古董(如果你关注本博的话,你是知道的,汗-),发现研究Qt是一件非常令人赏心悦目的事情.那感觉,就像你逛完了集美家具城看到一堆国产风格的家具后突然走进宜家的卖场一样.我并不是说宜家的家具有多么好,只不过宜家家具代表的北欧风格和家

QT中信号与槽的常见使用

一.标准信号与槽函数 有些信号和槽的函数模板都已经被写好了,只需要调用即可 下面是一个点击按钮关闭窗口的程序 .h文件 #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QPushButton> class MyWidget : public QWidget { Q_OBJECT //使用信号与槽的时候需要用到它 public: MyWidget(QWidget *parent = 0); ~MyW

qt多线程信号槽传输方式

//简单介绍一下QT信号与槽的连接方式:    //Qt::AutoConnection表示系统自动选择相应的连接方式,如果信号与槽在同一线程,就采用Qt::DirectConnection, //如果信号与槽不在同一线程,将采用Qt::QueuedConnection的连接方式.     //Qt::DirectConnection表示一旦信号产生,立即执行槽函数.     //Qt::QueuedConnection表示信号产生后,将发送Event给你的receiver所在的线程,postE

回调函数实现类似QT中信号机制

1. 定义回调接口类: class UIcallBack { public: virtual void onAppActivated() = 0; virtual void onShowMore() = 0; }; 2. 定义一个类 继承 回调接口类,并包含你要监听的类 class AppManager : public UIcallBack { public: AppManager(); UIManager uiManager; -- uiManager.setCallBack(this);