我有一个Qt项目,它有多个UI。我想每隔20秒检查一次wifi信号强度,并用信号强度值更新我所处的UI形式。我创建了一个带有基类QThread的myThread类并重新实现了run.Here我有一个超时为20秒的计时器。该线程在main.cpp类中启动。
void Thread_UpdateWifiSignal::run()
{
QTimer timer;
connect(&timer, SIGNAL(timeout()), this, SLOT(timerHit()), Qt::DirectConnection);
timer.setInterval(20000);
timer.start(); // puts one event in the threads event queue
exec();
qDebug() << "stopping timer";
timer.stop();
}
在timehit插槽中,我编写了一个代码来获取wifi信号强度,然后使用更新的wifi信号强度值发出SIGNAL。
void Thread_UpdateWifiSignal::timerHit()
{
QMutex mutex;
mutex.lock();
int SignalQuality = CheckWifiNetwork();
emit this->UpdatedSignalQuality(SignalQuality);
mutex.unlock();
}
int Thread_UpdateWifiSignal::CheckWifiNetwork()
{
//Code to get wifi signal strength
}
我在所有UI中都有一个快捷面板,它有一个显示wifi图标的标签。我想将线程发出的信号连接到UI类中的插槽,该插槽根据wifi信号强度更新图标wifi棒。
我看到线程正在运行,但是虽然我在UI表单类中实例化了myThread类,但为了连接发送到插槽的信号,我注意到发出的信号没有连接到插槽。
我该如何解决?
答案 0 :(得分:0)
此时,信号被发布到线程的事件循环中,这导致在子类线程中执行处理程序槽而不是“主线程”(管理GUI组件),因此不会出现gui更改。 / p>
您必须将子类线程中的信号UpdatedSignalQuality连接到处理程序槽,第三个参数为Qt :: QueuedConnection而不是Qt :: DirectConnection,然后信号将在主线程的事件循环中发布。
更多详情differences between QueuedConnection and DirectConection