QThread发出信号以连接到多个UI类

时间:2014-02-21 14:37:59

标签: multithreading qt signals-slots qthread

我有一个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类,但为了连接发送到插槽的信号,我注意到发出的信号没有连接到插槽。

我该如何解决?

1 个答案:

答案 0 :(得分:0)

此时,信号被发布到线程的事件循环中,这导致在子类线程中执行处理程序槽而不是“主线程”(管理GUI组件),因此不会出现gui更改。 / p>

您必须将子类线程中的信号UpdatedSignalQuality连接到处理程序槽,第三个参数为Qt :: QueuedConnection而不是Qt :: DirectConnection,然后信号将在主线程的事件循环中发布。

更多详情differences between QueuedConnection and DirectConection