首页 > 代码库 > 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 信号和槽链接时注意事项
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。