码迷,mamicode.com
首页 > 其他好文 > 详细

QT 信号和槽链接时注意事项

时间:2017-05-17 21:03:42      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:产生   unix   原因   queue   div   tin   interface   obj   block   

 

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

标签:产生   unix   原因   queue   div   tin   interface   obj   block   

原文地址:http://www.cnblogs.com/fanfan1108/p/6869313.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!