"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment mettre à jour en toute sécurité une fenêtre principale Qt à partir d'un thread séparé ?

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

Publié le 2024-11-02
Parcourir:457

How to Safely Update a Qt MainWindow from a Separate Thread?

Qt - Mise à jour de la fenêtre principale avec le deuxième thread

Dans les applications Qt multithread, mise à jour de l'interface utilisateur principale (mainwindow.ui) à partir d'un thread distinct peut poser un défi. Cet article traite d'un problème courant : impossibilité d'accéder aux éléments de l'interface utilisateur (tels que ana->ui->horizontalLayout_4 dans le code donné) à partir d'un thread personnalisé.

La solution implique d'utiliser le mécanisme de slot de signal de Qt, garantissant que les modifications de l'interface utilisateur sont effectuées uniquement à partir du thread principal. Voici comment implémenter cette approche :

  1. Créer un emplacement dans la fenêtre principale :

    • Déclarer un emplacement dans la classe de la fenêtre principale , tel que createLabel(const QString &imgSource). Cet emplacement gérera les modifications de l'interface utilisateur provenant d'autres threads.
  2. Définir un objet Worker :

    • Créer une classe qui hérite depuis QObject (au lieu de QThread) et définissez une méthode, newLabel(const QString &image), pour émettre un signal avec la source de l'image comme paramètre. Cette classe servira d'objet travailleur.
  3. Déplacez l'objet travailleur vers le deuxième thread :

    • Créez un instance de l'objet de travail et déplacez-le vers le deuxième thread à l'aide de la méthode moveToThread().
  4. Connectez les signaux et les emplacements :

    • Connectez le signal requestNewLabel émis par l'objet travailleur à l'emplacement createLabel dans la fenêtre principale.
  5. Invoquez la méthode Worker :

    • À partir du deuxième thread, appelez la méthode newLabel de l'objet travailleur, en passant la source de l'image comme argument. Cela déclenchera la connexion signal-slot et mettra à jour l'interface utilisateur principale à partir du thread principal.

En implémentant cette approche, les modifications de l'interface utilisateur provenant d'autres threads peuvent être gérées en toute sécurité via des signaux et slots, assurant la synchronisation avec le thread principal. Cela évite les incohérences ou les plantages potentiels de l'interface utilisateur causés par l'accès direct aux éléments de l'interface utilisateur à partir de threads non principaux.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3