ホームページ  >  記事  >  バックエンド開発  >  Qt メイン ウィンドウをセカンダリ スレッドから安全に更新するにはどうすればよいですか?

Qt メイン ウィンドウをセカンダリ スレッドから安全に更新するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-26 13:22:29753ブラウズ

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

Qt - セカンダリ スレッドからメイン ウィンドウを更新する

問題:

マルチスレッド 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。