Maison > développement back-end > C++ > le corps du texte

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

DDD
Libérer: 2024-10-26 13:22:29
original
752 Les gens l'ont consulté

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);
}
Copier après la connexion

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 &);
};
Copier après la connexion

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

QThread *thread = new QThread(this);
GUIUpdater *updater = new GUIUpdater();
updater->moveToThread(thread);
Copier après la connexion

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)));
Copier après la connexion

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

updater->newLabel("h:/test.png");
Copier après la connexion

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);
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!