QT 信号和槽链接时注意事项
Posted 帆帆1108
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT 信号和槽链接时注意事项相关的知识,希望对你有一定的参考价值。
1、需要继承Qobject 。
2、需要有Q_OBJECT宏。
3、如果有多重的继承关系,则每个子类都需要单独写Q_OBJECT宏,不能因为父类有Q_OBJECT宏就省略。
4、继承Qobject的类的声明必须在.h文件中,否则无法产生moc文件,信号和槽的链接就不起作用。
1 class myClass : public QObject 2 { 3 Q_OBJECT 4 public: 5 myClass(){}
6 }
5、信号和槽的链接用 connect函数。
//!旧链接方式 编译时不检查(对象,槽,信号)存在与否,不做隐式转换,错误只能再运行时发现。 connect( &mTcpServer, SIGNAL(newConnection()), pIoIntf, SLOT(test()) ); //!新链接方式 编译时会检查,参数会做隐式转换。 QObject::connect( &mTcpServer, &QTcpServer::newConnection, pIoIntf, &CSocketInterface::test );
6、connect的第五个参数有以下几个选项,这里对五个参数的说明参考的 http://blog.chinaunix.net/uid-24219701-id-4042043.html 的帖子。
特别注意的是:平时使用connect函数,如果不指定第五个参数,则默认是Qt::AutoConnection, 一定要检查发射信号的对象与槽函数所在的对象是否在同一个线程。
1、如果在同一个线程,则默认是直接调用的方式,一般没什么问题。
2、如果不在同一个线程,则默认使用队列异步调用的方式,如果两个线程都不会被挪动,那一般也没什么问题。
3、如果不在同一个线程,且这两个线程在程序运行期间会被挪动,那就会出现信号发送出去,槽函数没反应的现象,而且一般还不太好找原因, 如果出现这种问题,可视情况指定Qt::DirectConnection参数,采用直接调用的方式解决。
Qt::DirectConnection //直接连接意味着槽函数将在信号发出的线程直接调用 Qt::QueuedConnection //队列连接意味着向接受者所在线程发送一个事件,该线程的事件循环将获得这个事件,然后之后的某个时刻调用槽函数 Qt::BlockingQueuedConnection //阻塞的队列连接就像队列连接,但是发送者线程将会阻塞,直到接受者所在线程的事件循环获得这个事件,槽函数被调用之后,函数才会返回 Qt::AutoConnection //自动连接(默认)意味着如果接受者所在线程就是当前线程,则使用直接连接;否则将使用队列连接
以上是关于QT 信号和槽链接时注意事项的主要内容,如果未能解决你的问题,请参考以下文章