Qt - 非 UI 線程與 UI 線程的交互


正文

界面

頭文件

#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(深入理解)》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM