正文
界面
頭文件
#include <QtWidgets/QMainWindow>
#include "ui_QtGuiApplication5.h"
#include <QThread>
class WorkerThread : public QThread
{
Q_OBJECT
// 重寫 run 函數,用於執行耗時操作
void run() override {
int val = 0;
while (val < 100)
{
++val;
emit resultReady(val);
msleep(50);
}
}
signals:
// 聲明 resultReady 信號,用於通知 UI 線程
void resultReady(int val);
};
class QtGuiApplication5 : public QMainWindow
{
Q_OBJECT
public:
QtGuiApplication5(QWidget *parent = Q_NULLPTR);
private:
Ui::QtGuiApplication5Class ui;
private slots:
// 第一個槽,用於接收按鈕點擊信號,開啟非 UI 線程執行耗時操作
void StartWorkInAThread();
// 第二個槽,用於接收非 UI 線程中的通知信號,然后更新 UI
void HandleResults(int val);
};
源文件
#include "QtGuiApplication5.h"
QtGuiApplication5::QtGuiApplication5(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(StartWorkInAThread()));
}
void QtGuiApplication5::StartWorkInAThread()
{
WorkerThread *workerThread = new WorkerThread();
// 連接非 UI 線程中的信號和 UI 線程中的槽
connect(workerThread, SIGNAL(resultReady(int)), this, SLOT(HandleResults(int)));
connect(workerThread, SIGNAL(finished()), workerThread, SLOT(deleteLater()));
workerThread->start();
}
void QtGuiApplication5::HandleResults(int val)
{
ui.progressBar->setValue(val);
}
參考
一去丶二三里 - 《Qt 之 QThread(深入理解)》