QT系列——信号槽连接方式

举报
小糖饼最甜呀 发表于 2022/04/04 11:28:52 2022/04/04
【摘要】 本文主要讲QT信号槽的连接方式。QT使用connect函数进行连接信号槽。目前QT5文档中提供了五个connect的重载函数。如下:connect(const QObject *, const char *, const QObject *, const char *, Qt::ConnectionType )connect(const QObject *, const QMetaMetho...

本文主要讲QT信号槽的连接方式。QT使用connect函数进行连接信号槽。
目前QT5文档中提供了五个connect的重载函数。如下:

connect(const QObject *, const char *, const QObject *, const char *, Qt::ConnectionType )
connect(const QObject *, const QMetaMethod &, const QObject *, const QMetaMethod &, Qt::ConnectionType )
connect(const QObject *, const char *, const char *, Qt::ConnectionType ) const
connect(const QObject *, PointerToMemberFunction , const QObject *, PointerToMemberFunction , Qt::ConnectionType )
connect(const QObject *, PointerToMemberFunction , Functor )
connect(const QObject *, PointerToMemberFunction , const QObject *, Functor , Qt::ConnectionType )

connect函数

接下来一一讲解。

  1. 第一种方式时比较传统的一种信号槽连接方式。函数名称与参数类型都比较直观明确。
  2. 第二种采用QMetaMethod方式,可以通过QMetaMethod进行类型比对等。
  3. 第三种与第一种的信号槽连接方式相似,只是省略了接收方,接收方这里指的是this对象。这种写法省略了this,使信号槽连接代码简洁。
  4. 第四种方式采用函数指针的方式进行绑定,省略了函数的参数类型,只指明了信号槽的函数名。这种写法通常适用于没有重载函数的信号槽函数。
  5. 第五种的信号依然是函数指针,这里也省略了接收方。最后一个参数是槽函数,可以是this对象的槽函数或者是lambda表达式等。
  6. 第六种与第五种的信号槽连接方式相似,这里明确指明了接收方。

connect连接类型

connect函数的最后一个参数是Qt::ConnectionType,该类型指明信号槽的连接方式。
Qt::ConnectionType定义如下:

Qt::AutoConnection
Qt::DirectConnection
Qt::QueuedConnection
Qt::BlockingQueuedConnection
Qt::UniqueConnection
  1. Qt::AutoConnection

这是最常用的连接类型,也是connect函数的默认连接类型。

如果接收方与发送方在同一线程中,相当于使用Qt::DirectConnection;
如果接收方与发送方在不同线程中,相当于使用Qt::QueuedConnection。
连接类型是在信号发出时确定的。

  1. Qt::DirectConnection

该类型适用于单线程场合。
当信号发出时,槽函数在信号所在的线程中立即被调用。相当于实时调用,类似直接函数调用。

  1. Qt::QueuedConnection

该类型适用于多线程异步场合。
信号发送后,由接收方线程事件队列处理,发送方所在线程会继续向下执行。
槽函数在接收方的线程中执行,并不是实时调用的。

  1. Qt::BlockingQueuedConnection

该类型适用于多线程同步场合。
信号发送后,由接收方线程事件队列处理,只是在槽函数返回之前信号所在的线程会阻塞。
槽函数在接收方的线程中执行。 如果接收方与发送方在同一线程,不能使用该连接类型。

  1. Qt::UniqueConnection

该类型用于防止重复连接。
这是一个标志,可以与以上四种连接类型通过按位或的方式进行组合。使用该类型进行连接时,当相同的信号槽已经连接过了,就会连接失败。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。