QT系列——信号槽连接方式
【摘要】 本文主要讲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函数
接下来一一讲解。
- 第一种方式时比较传统的一种信号槽连接方式。函数名称与参数类型都比较直观明确。
- 第二种采用QMetaMethod方式,可以通过QMetaMethod进行类型比对等。
- 第三种与第一种的信号槽连接方式相似,只是省略了接收方,接收方这里指的是this对象。这种写法省略了this,使信号槽连接代码简洁。
- 第四种方式采用函数指针的方式进行绑定,省略了函数的参数类型,只指明了信号槽的函数名。这种写法通常适用于没有重载函数的信号槽函数。
- 第五种的信号依然是函数指针,这里也省略了接收方。最后一个参数是槽函数,可以是this对象的槽函数或者是lambda表达式等。
- 第六种与第五种的信号槽连接方式相似,这里明确指明了接收方。
connect连接类型
connect函数的最后一个参数是Qt::ConnectionType,该类型指明信号槽的连接方式。
Qt::ConnectionType定义如下:
Qt::AutoConnection
Qt::DirectConnection
Qt::QueuedConnection
Qt::BlockingQueuedConnection
Qt::UniqueConnection
- Qt::AutoConnection
这是最常用的连接类型,也是connect函数的默认连接类型。
如果接收方与发送方在同一线程中,相当于使用Qt::DirectConnection;
如果接收方与发送方在不同线程中,相当于使用Qt::QueuedConnection。
连接类型是在信号发出时确定的。
- Qt::DirectConnection
该类型适用于单线程场合。
当信号发出时,槽函数在信号所在的线程中立即被调用。相当于实时调用,类似直接函数调用。
- Qt::QueuedConnection
该类型适用于多线程异步场合。
信号发送后,由接收方线程事件队列处理,发送方所在线程会继续向下执行。
槽函数在接收方的线程中执行,并不是实时调用的。
- Qt::BlockingQueuedConnection
该类型适用于多线程同步场合。
信号发送后,由接收方线程事件队列处理,只是在槽函数返回之前信号所在的线程会阻塞。
槽函数在接收方的线程中执行。 如果接收方与发送方在同一线程,不能使用该连接类型。
- Qt::UniqueConnection
该类型用于防止重复连接。
这是一个标志,可以与以上四种连接类型通过按位或的方式进行组合。使用该类型进行连接时,当相同的信号槽已经连接过了,就会连接失败。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)