首頁 > 後端開發 > C++ > 主體

如何從輔助線程安全地更新 Qt 主視窗?

DDD
發布: 2024-10-26 13:22:29
原創
752 人瀏覽過

How to Safely Update a Qt Main Window from a Secondary Thread?

Qt - 從輔助執行緒更新主視窗

問題:

在多執行緒中,嘗試從主執行緒以外的執行緒更新主視窗的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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!