专栏首页祥的专栏[Qt]connect()参数Qt:ConnectionType使用讲解

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

原创文章

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


文章目录
  • @[toc]
  • 1.问题来源
  • 2.参数详解
  • 3.使用建议

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

Constant

Value

Description

解释

Qt::AutoConnection

0

(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::DirectConnection

1

The slot is invoked immediately when the signal is emitted. The slot is executed in the signalling thread.

直接连接:当信号发射时,槽函数将直接被调用。无论槽函数所属对象在哪个线程,槽函数都在发射信号的线程内执行。[这种方式不能跨线程传递消息]

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

3

Same 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::UniqueConnection

0x80

This 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都被执行)。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Maat:自动分析VirusTotal以进行准确标记和有效的恶意软件检测方法(CS CS)

    恶意软件分析和检测研究社区依靠在线平台VirusTotal来基于大约60个抗病毒扫描程序的扫描结果标记Android应用程序。不幸的是,目前尚无关于如何最好地解...

    刘子蔚
  • ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)

    Bipin Joshi (http://www.binaryintellect.net/articles/f1cee257-378a-42c1-9f2f-075...

    蒋金楠
  • 实战|手把手教你训练一个基于Keras的多标签图像分类器

    原文链接:https://www.pyimagesearch.com/2018/05/07/multi-label-classification-with-ke...

    材ccc
  • Python练手题,敢来挑战吗?

    这到题用到了字符串的所有字母大写和所有字母小写和字符串拼接,复制,用到的函数有 json 将列表中的内容按照指定字符连接成一个字符串,

    小小科
  • 前端慌不慌?用深度学习自动生成HTML代码

    机器之心
  • 用以适应社交惯例的对抗性自娱自乐(cs AI)

    机器人代理必须采用现有的社交习俗才能成为有效的队友。这些社会惯例,例如在道路的右侧或左侧行驶,是最佳策略中的任意选择,但是成功的团队中的所有代理必须使用相同的惯...

    DANDAN用户6837186
  • 前端慌不慌?用深度学习自动生成HTML代码

    编程软文

扫码关注云+社区

领取腾讯云代金券