問題:
マルチスレッド 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);
アップデーターの requestNewLabel 信号を、メイン ウィンドウ:
connect(updater, SIGNAL(requestNewLabel(QString)), this, SLOT(createLabel(QString)));
二次スレッドから newLabel メソッドを呼び出して更新をトリガーします:
updater->newLabel("h:/test.png");
メイン ウィンドウのスロット内:
void createLabel(const QString &imgSource) { QPixmap i1(imgSource); QLabel *label = new QLabel(this); label->setPixmap(i1); layout->addWidget(label); }
これこのソリューションにより、Qt のスレッド安全性の保証を維持しながら、セカンダリ スレッドからの安全かつ効率的な UI 更新が可能になります。
以上がQt メイン ウィンドウをセカンダリ スレッドから安全に更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。