1.正确用法
无需子类化线程类,通过信号启动定时器。
-
TestClass::TestClass(QWidget *parent)
-
QWidget(parent)
{
m_pThread = new QThread(this);
m_pTimer = new QTimer();
m_pTimer->moveToThread(m_pThread);
m_pTimer->setInterval(1000);
connect(m_pThread, SIGNAL(started()), m_pTimer, SLOT(start()));
connect(m_pTimer, &QTimer::timeout, this, &ThreadTest::timeOutSlot, Qt::DirectConnection);
}
通过moveToThread()方法改变定时器所处的线程,不要给定时器设置父类,否则该函数将不会生效。
在信号槽连接时,我们增加了一个参数——连接类型,先看看该参数可以有哪些值:
Qt::AutoConnection:默认值。如果接收者处于发出信号的线程中,则使用Qt::DirectConnection,否则使用Qt::QueuedConnection,连接类型由发出的信号决定。
Qt::DirectConnection:信号发出后立即调用槽函数,槽函数在发出信号的线程中执行。
Qt::QueuedConnection:当控制权返还给接收者信号的事件循环中时,开始调用槽函数。槽函数在接收者的线程中执行。