QT-How 将 QWidget 与 QThread 一起使用?

QT-How to utilize QWidget with QThread?

我正在通过 QT 制作一些 GUI。 我几乎完成了我的工作,但我很难处理 Qthread。 我的目标是测量电机的位置(它移动)并将其显示在 Qtextbrowser 上,同时在主线程中运行另一个函数。当我编写如下代码时,人们说我不能在线程中直接使用 QTextBrowser(Qwidget),所以我正在搜索如何将 return location 值传递给主线程。可以帮我个忙吗? MDCE 是另一个 header 中的 class,我附上的代码是我第一个代码的一部分。

void MotorPort::StartThread(MDCE* com, QTextBrowser* browser)
{

    thread1 = QThread::create(std::bind(&MotorPort::MeasureLocation,this,com,browser));
    thread1 -> start();
}

void MotorPort::MeasureLocation(MDCE* com, QTextBrowser* browser)
{
    double location;
    while(1)
    {
        location = CurrentLocation(com); \return current position value
        browser->setText(QString::number(location));
        if (QThread::currentThread()->isInterruptionRequested()) return ;
    }
}

void MotorPort::stopMeasure()
{
    thread1->requestInterruption();
    if (!thread1->wait(3000))
    {
        thread1->terminate();
        thread1->wait();
    }
    thread1 = nullptr;
}

您应该使用 Qt signal/slot 机制来进行这样的 iter-thread 通知。首先更改您的 MotorPort class 定义以声明信号 location_changed...

class MotorPort: public QObject {
    Q_OBJECT;
signals:
    void location_changed(QString location);
    ...
}

现在,与其 MotorPort::MeasureLocation 直接调用 QTextBrowser::setText,不如发出 location_changed 信号...

void MotorPort::MeasureLocation (MDCE *com, QTextBrowser *browser)
{
    while (true) {
        double location = CurrentLocation(com);

        /*
         * Emit signal to notify of location update.
         */
        emit location_changed(QString::number(location));
        if (QThread::currentThread()->isInterruptionRequested())
            return ;
    }
}

最后,更新 MotorPort::StartThread 以将信号连接到浏览器的 setText 插槽...

void MotorPort::StartThread (MDCE *com, QTextBrowser *browser)
{
    connect(this, &MotorPort::location_changed, browser, &QTextBrowser::setText);
    thread1 = QThread::create(std::bind(&MotorPort::MeasureLocation, this, com, browser));
    thread1->start();
}