[Qt]connect()参数Qt:ConnectionType使用讲解



原创文章,欢迎转载。转载请注明:转载自 祥的博客

原文链接:https://blog.csdn.net/humanking7/article/details/86064859


connect()参数Qt:ConnectionType使用讲解

1.问题来源

一般情况下我们用connect函数不会关注它的最后一个参数,因为它默认是Qt::AutoConnection会自适应,但是有时候还是需要自己指定一下,比较靠谱(最近用到一个多线程之间的通信问题,所以就研究了一下)。

//一般使用,不会关注第5个参数
connect(ui.btn, SIGNAL(clicked()), this, SLOT(slot_openBtn()));

//函数原型,第5个参数默认为 Qt::AutoConnection
connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType = Qt::AutoConnection);

2.参数详解

那么我们来关注一下这个枚举类型 Qt::ConnectionType

ConstantValueDescription解释
Qt::AutoConnection0(Default) If the receiver lives in the thread that emits the signal, Qt::DirectConnection is used. Otherwise, Qt::QueuedConnection is used. The connection type is determined when the signal is emitted.自动连接:(默认值)如果信号在接收者所依附的线程内发射,则等同于直接连接。如果发射信号的线程和接受者所依附的线程不同,则等同于队列连接
Qt::DirectConnection1The slot is invoked immediately when the signal is emitted. The slot is executed in the signalling thread.直接连接:当信号发射时,槽函数将直接被调用。无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行。[这种方式不能跨线程传递消息]
Qt::QueuedConnection2The 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::BlockingQueuedConnection3Same as Qt::QueuedConnection, except that the signalling thread blocks until the slot returns. This connection must not be used if the receiver lives in the signalling thread, or else the application will deadlock.Qt::QueuedConnection类似,但是发送消息后会阻塞,直到等到关联的slot都被执行。[说明它是专门用来多线程间传递消息的,而且是阻塞的]
Qt::UniqueConnection0x80This is a flag that can be combined with any one of the above connection types, using a bitwise OR. When Qt::UniqueConnection is set, QObject::connect() will fail if the connection already exists (i.e. if the same signal is already connected to the same slot for the same pair of objects). This flag was introduced in Qt 4.6.这个标志可以和上述标志通过或OR来结合使用。用于失能已经存在的connection

3.使用建议

那么如何使用呢?

  • 如果是在同一线程里面的操作(signalslot都在同一个线程),那么用Qt::DirectConnection的效率最高(使用默认值Qt::AutoConnection也OK),主要是Qt::DirectConnectionQt::QueuedConnection都需要储存到队列。
  • 如果是多个线程之间进行消息传递(signalslot都在不同线程),那么就要用到Qt::QueuedConnection或者Qt::BlockingQueuedConnection,不过一个是无阻塞的(Qt::QueuedConnection),一个是阻塞的(Qt::BlockingQueuedConnection,发送消息后会阻塞,直到所有的slot都被执行)。

赞赏码New

  • 17
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qtconnect 函数是用于连接信号与槽的,它是 Qt 的一个重要特性之一。该函数的原型为: `QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType type = Qt::AutoConnection)` 参数说明如下: 1. `sender`:发送信号的对象,通常是一个 QObject 或其派生类的实例。 2. `signal`:信号的名称,以字符串形式表示。信号是 QObject 类中声明的一个带有特殊宏的函数。 3. `receiver`:接收信号的对象,通常也是一个 QObject 或其派生类的实例。 4. `member`:槽函数的名称,以字符串形式表示。槽函数是接收信号并处理的函数。 5. `type`:连接类型,用于指定连接的属性。包括以下几种类型: - `Qt::AutoConnection`:自动选择连接类型,根据 sender 和 receiver 的线程关系决定。 - `Qt::DirectConnection`:直接连接,信号发出时立即调用槽函数,无论所在线程是否相同。 - `Qt::QueuedConnection`:队列连接,将信号放入接收者线程的事件队列中,在适当的时候调用槽函数。适用于不同线程之间的连接。 - `Qt::BlockingQueuedConnection`:阻塞队列连接,和 Qt::QueuedConnection 类似,但是在槽函数返回之前,发出信号的线程会被阻塞。 - `Qt::UniqueConnection`:确保连接是唯一的,如果已经存在相同的连接,则不会再次连接。 这些参数可以根据具体情况进行调整,以满足不同的需求。注意:connect 函数返回一个 QMetaObject::Connection 类型的对象,可以用于后续的连接管理或取消连接操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值