Heim  >  Artikel  >  Backend-Entwicklung  >  Wie aktualisiere ich ein Qt-Hauptfenster sicher von einem sekundären Thread aus?

Wie aktualisiere ich ein Qt-Hauptfenster sicher von einem sekundären Thread aus?

DDD
DDDOriginal
2024-10-26 13:22:29831Durchsuche

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

Qt – Hauptfenster von einem sekundären Thread aktualisieren

Problem:

In einer Multithread-Qt-Anwendung ein Versuch dazu Das Aktualisieren der Benutzeroberfläche des Hauptfensters (mainwindow.ui) von einem anderen Thread als dem Hauptthread führt zu einem Fehler. Konkret schlägt der folgende Code fehl:

mythread::run()
{
    QPixmap i1 (":/notes/pic/4mdodiyez.jpg");
    QLabel *label = new QLabel();
    label->setPixmap(i1);
    ana->ui->horizontalLayout_4->addWidget(label);
}

Lösung:

Das Ändern der Benutzeroberfläche von einem sekundären Thread aus ist in Qt aufgrund von Thread-Sicherheitsbedenken nicht direkt möglich. Der empfohlene Ansatz besteht darin, die UI-Änderungen in einen Slot im Hauptfenster zu verschieben und ein Signal vom sekundären Thread mit diesem Slot zu verbinden.

Implementierung:

Implementieren Sie a Worker-Klasse zur Verarbeitung der Aktualisierungen:

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 &);
};

Erstellen und verschieben Sie das GUIUpdater-Objekt in einen sekundären Thread:

QThread *thread = new QThread(this);
GUIUpdater *updater = new GUIUpdater();
updater->moveToThread(thread);

Verbinden Sie das requestNewLabel-Signal des Updaters mit einem Slot, der die Beschriftung im erstellt Hauptfenster:

connect(updater, SIGNAL(requestNewLabel(QString)), this, SLOT(createLabel(QString)));

Rufen Sie die newLabel-Methode aus dem sekundären Thread auf, um die Aktualisierung auszulösen:

updater->newLabel("h:/test.png");

Im Slot des Hauptfensters:

void createLabel(const QString &imgSource) {
    QPixmap i1(imgSource);
    QLabel *label = new QLabel(this);
    label->setPixmap(i1);
    layout->addWidget(label);
}

Dies Die Lösung ermöglicht sichere und effiziente UI-Updates von sekundären Threads unter Beibehaltung der Thread-Sicherheitsgarantien von Qt.

Das obige ist der detaillierte Inhalt vonWie aktualisiere ich ein Qt-Hauptfenster sicher von einem sekundären Thread aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn