【问题标题】:QThread emitted signal to connect to multiple UI classesQThread 发出信号以连接到多个 UI 类
【发布时间】:2014-03-23 03:20:21
【问题描述】:

我有一个有多个 UI 的 Qt 项目。我想每 20 秒检查一次 wifi 信号强度,并用信号强度值更新我所在的 UI 表单。我创建了一个带有基类 QThread 的 myThread 类并重新实现了运行。这里我有一个超时时间为 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 类,以将发出的信号连接到插槽,但我注意到发出的信号没有连接到插槽。

我该怎么做?

【问题讨论】:

标签: multithreading qt signals-slots qthread


【解决方案1】:

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

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

更多详情differences between QueuedConnection and DirectConection

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多