优秀的编程知识分享平台

网站首页 > 技术文章 正文

Qt在多个子线程中更新UI(qt子线程向主线程发消息)

nanyue 2025-02-03 14:22:55 技术文章 3 ℃


在多个子线程中更新 UI 的通用方法是使用信号和槽机制进行线程间通信。具体步骤如下:

  1. 定义一个 QObject 子类,作为主窗口的控制器对象。
  2. 在控制器对象中定义一个信号,用于在子线程中发射更新 UI 的请求。
  3. 在主窗口中创建控制器对象,并将其与主窗口进行关联。
  4. 在主窗口中定义一个槽函数,用于接收控制器对象发射的信号。
  5. 在需要更新 UI 的子线程中,通过控制器对象发射信号,触发主窗口中的槽函数更新 UI。
  6. 在槽函数中使用主窗口的线程安全函数(例如 QMetaObject::invokeMethod)来更新 UI。

以下是一个简单的示例:

// 控制器对象
class Controller : public QObject {
    Q_OBJECT

public:
    Controller(QObject *parent = nullptr) : QObject(parent) {}

signals:
    void updateUI();

};

// 主窗口
class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
        // 创建控制器对象并与主窗口关联
        controller = new Controller(this);
        connect(controller, &Controller::updateUI, this, &MainWindow::updateUI);
    }

public slots:
    void updateUI() {
        // 使用主窗口的线程安全函数更新 UI
        QMetaObject::invokeMethod(this, "setText", Qt::QueuedConnection, Q_ARG(QString, "Hello World"));
    }

private:
    Controller *controller;

};

在子线程中,通过控制器对象发射信号即可触发主窗口中的更新 UI 操作:

void workerThread() {
    // ...
    emit controller->updateUI();
    // ...
}

Tags:

最近发表
标签列表