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

网友投稿 1320 2022-05-30

本文主要讲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系列——信号槽连接方式

信号发送后,由接收方线程事件队列处理,发送方所在线程会继续向下执行。

槽函数在接收方的线程中执行,并不是实时调用的。

Qt::BlockingQueuedConnection

该类型适用于多线程同步场合。

信号发送后,由接收方线程事件队列处理,只是在槽函数返回之前信号所在的线程会阻塞。

槽函数在接收方的线程中执行。 如果接收方与发送方在同一线程,不能使用该连接类型。

Qt::UniqueConnection

该类型用于防止重复连接。

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

Qt

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:在 Mac 上打包 PyQT 程序
下一篇:偶发的el-select无法选择的问题
相关文章