QT信号与槽的连接后槽函数执行方式 | 您所在的位置:网站首页 › Qt的connect为什么不出现 › QT信号与槽的连接后槽函数执行方式 |
问题
信号与槽是QT特有的一种功能吧,当使用connect函数将一个信号于一个槽函数绑定过后,那么信号当emit后,就会执行与之绑定的槽函数,那么问题来了,这个执行方式是怎样的,是立刻的还是异步的。如果是立刻的就是以中断形式去执行的,异步的也就是通过事件循环方式去执行的。 是以中断形式去执行的?既当信号emit后就立即去执行槽函数,槽函数结束后返回,继续执行emit语句后的语句。 还是以事件循环形式执行的?既当信号emit后,当成一个事件,进入事件队列,经由事件循环,最终去执行。 探索问题抱着上述问题,我们首先找到connect函数,先看其函数原型(connect函数有重载,我们找个我们最常用的那个),如下: QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver,const char *method, Qt::ConnectionType type = Qt::AutoConnection)我们主要看其中connect的参数: const QObject *sender 发出信号的对象指针 const char *signal 信号指针 const QObject *receiver 接收信号的对象指针 const char *method 待绑定的方法,也就是槽函数 Qt::ConnectionType type = Qt::AutoConnection 连接方式 我们在习惯性用的connect函数一般只设置四个参数,对最后一个参数不进行设置,即一般是下面这种情况: connect(myButton, SIGNAL(clicked()), this, SIGNAL(buttonClicked()));那么为了要了解执行方式,我们是时候了解下对后一个参数的含义了,经查手册可以看到Qt::ConnectionType可以有以下几种情况: 经过上面的分析我们可以知道,一般常用的connect后执行方式有两种方式: 1、中断方式 2、异步方式 中断方式只需要将连接方式换成Qt::DirectConnection就可以了。 异步方式只需要将连接方式换成Qt::QueuedConnection就可以了。 验证结论为验证以上结论我做了简单的测试(关于在不同线程之间我没做,变得也就是槽函数在哪个线程里面执行的而已)。分两步测试验证中断方式和异步方式。 中断方式测试测试中断方式我们采用如下代码 connect(this,SIGNAL(testsignal()), this,SLOT(testslot()),Qt::DirectConnection); void Widget::testslot() { qDebug() |
CopyRight 2018-2019 实验室设备网 版权所有 |