Heim > Backend-Entwicklung > C++ > Hauptteil

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

DDD
Freigeben: 2024-10-26 13:22:29
Original
830 Leute haben es durchsucht

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);
}
Nach dem Login kopieren

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 &);
};
Nach dem Login kopieren

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

QThread *thread = new QThread(this);
GUIUpdater *updater = new GUIUpdater();
updater->moveToThread(thread);
Nach dem Login kopieren

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)));
Nach dem Login kopieren

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

updater->newLabel("h:/test.png");
Nach dem Login kopieren

Im Slot des Hauptfensters:

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

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage