10
votes

QProgressBar ne montrait pas les progrès?

Mon premier naïf à la mise à jour de ma barre de progression consistait à inclure les lignes suivantes dans ma boucle qui fait le traitement, faisant quelque chose comme ceci: xxx

Je pensais ajouter le repeindre () rendrait la pause d'exécution pendant la mise à jour de l'interface graphique, mais apparemment, ce n'est pas si simple. Après avoir examiné les questions:

erreur qprogressbar

La barre de progression ne montre pas la progression

IT On dirait que je vais devoir mettre le traitement des données dans un fil différent, puis connecter un signal du fil de traitement de données au thread de l'interface graphique pour mettre à jour la barre de progression. Je suis plutôt inexpérimenté avec Guisse et Threads et je me demandais si quelqu'un pouvait me signaler dans la bonne direction, c'est-à-dire quelles classes Qt devais-je regarder en utilisant pour cela. Je suppose que j'ai besoin d'un objet QThread, mais je regarde à travers la documentation QProgressBar, mais cela n'aborge pas le sujet de la filetage.


0 commentaires

3 Réponses :


2
votes

Vous pouvez créer une sous-classe de qthread qui émet un signal progresssifChanged , que vous connectez au qprogressbar . .

connect () fait les connexions connexions auto par défaut. Cela signifie que le mécanisme de la fente de signaux s'occupe déjà des problèmes de filetage pour vous, de sorte que vous n'avez pas à vous soucier de cela.


0 commentaires

3
votes

Vous devez appeler qapplication :: Processevents () périodiquement à l'intérieur de votre boucle de traitement pour la laisser gérer les événements de l'interface utilisateur.

Comme Georg le dit, QT est un environnement multitâche coopératif unique. Vous obtenez un contrôle total de votre processus jusqu'à ce que vous le renoncez volontairement avec des procédures de traitement () - jusqu'à ce que vous fassiez cela, QT ne peut pas mettre à jour les éléments de l'interface utilisateur, gérer les demandes HTTP asynchrones, gérer les entrées ou à peu près autre chose. C'est à vous de vous assurer que les trucs obtiennent une émission de temps pendant que vous êtes dans une longue boucle de traitement.


0 commentaires

13
votes

Comme @RJH et @georg ont souligné, il existe essentiellement deux options différentes:

  1. Traitement de la force des événements utilisant Qaplication :: Processivents () , Ou
  2. Créer un thread qui émet des signaux pouvant être utilisés pour mettre à jour le Barre de progression

    Si vous faites un traitement non trivial, je vous recommanderais de déplacer le traitement à un fil.

    La chose la plus importante à savoir sur les threads est que, à l'exception du thread de l'interface graphique principale (que vous ne démarrez ni créez ni ne crée), Vous ne pouvez jamais mettre à jour l'interface graphique directement à partir d'un fil .

    Le dernier paramètre de qObject: : Connect () est un Qt :: ConnectionType Enum que par défaut prend en compte si des threads sont impliqués.

    Ainsi, vous devriez pouvoir créer une sous-classe simple de QThread qui fait le traitement: xxx

    puis quelque part dans votre code d'interface graphique: xxx


0 commentaires