問題:
在多執行緒中,嘗試從主執行緒以外的執行緒更新主視窗的UI (mainwindow.ui) 會導致錯誤。具體來說,以下程式碼會失敗:
mythread::run() { QPixmap i1 (":/notes/pic/4mdodiyez.jpg"); QLabel *label = new QLabel(); label->setPixmap(i1); ana->ui->horizontalLayout_4->addWidget(label); }
解決方案:
由於執行緒安全問題,在 Qt 中無法直接從輔助執行緒修改 UI。建議的方法是將 UI 修改移至主視窗中的插槽,並將訊號從輔助執行緒連接到該插槽。
實作:
實作處理更新的工作類別:
class GUIUpdater : public QObject { Q_OBJECT public: explicit GUIUpdater(QObject *parent = 0) : QObject(parent) {} void newLabel(const QString &image) { emit requestNewLabel(image); } signals: void requestNewLabel(const QString &); };
建立GUIUpdater 物件並將其移至輔助執行緒:
QThread *thread = new QThread(this); GUIUpdater *updater = new GUIUpdater(); updater->moveToThread(thread);建立GUIUpdater 物件並將其移至輔助執行緒:
connect(updater, SIGNAL(requestNewLabel(QString)), this, SLOT(createLabel(QString)));將更新程式的requestNewLabel 訊號連接到在中建立標籤的槽主視窗:
updater->newLabel("h:/test.png");從輔助執行緒呼叫newLabel方法觸發更新:
void createLabel(const QString &imgSource) { QPixmap i1(imgSource); QLabel *label = new QLabel(this); label->setPixmap(i1); layout->addWidget(label); }呼叫newLabel方法觸發更新:呼叫newLabel方法觸發更新:呼叫newLabel方法觸發更新:呼叫newLabel方法觸發更新:在主視窗的插槽:這個這個解決方案允許從輔助執行緒進行安全且有效率的UI 更新,同時保持Qt 的執行緒安全保證。
以上是如何從輔助線程安全地更新 Qt 主視窗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!