Maison >développement back-end >C++ >Comment mettre à jour en toute sécurité une fenêtre principale de Qt à partir d'un thread secondaire ?

Comment mettre à jour en toute sécurité une fenêtre principale de Qt à partir d'un thread secondaire ?

DDD
DDDoriginal
2024-10-26 13:22:29837parcourir

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

Qt - Mise à jour de la fenêtre principale à partir d'un thread secondaire

Problème :

Dans une application Qt multithread, une tentative de mettre à jour l'interface utilisateur de la fenêtre principale (mainwindow.ui) à partir d'un thread autre que le thread principal entraîne une erreur. Plus précisément, le code suivant échoue :

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

Solution :

La modification de l'interface utilisateur à partir d'un thread secondaire n'est pas directement possible dans Qt en raison de problèmes de sécurité des threads. L'approche recommandée consiste à déplacer les modifications de l'interface utilisateur vers un emplacement dans la fenêtre principale et à connecter un signal du thread secondaire à cet emplacement.

Mise en œuvre :

Implémenter un classe de travail pour gérer les mises à jour :

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

Créez et déplacez l'objet GUIUpdater vers un thread secondaire :

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

Connectez le signal requestNewLabel du programme de mise à jour à un emplacement qui crée l'étiquette dans le fenêtre principale :

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

Invoquez la méthode newLabel depuis le thread secondaire pour déclencher la mise à jour :

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

Dans l'emplacement de la fenêtre principale :

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

Ceci La solution permet des mises à jour sûres et efficaces de l'interface utilisateur à partir des threads secondaires tout en conservant les garanties de sécurité des threads de Qt.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn