首页 > 代码库 > QT 信号和槽链接时注意事项

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 信号和槽链接时注意事项