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: Je pensais ajouter le erreur qprogressbar 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. P> P> repeindre () code> 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: p>
La barre de progression ne montre pas la progression p>
3 Réponses :
Vous pouvez créer une sous-classe de qthread code> qui émet un signal
progresssifChanged code>, que vous connectez au
qprogressbar code>. p>.
connect () code> fait les connexions
connexions auto code> 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. P>
Vous devez appeler 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. P> qapplication :: Processevents () code> périodiquement à l'intérieur de votre boucle de traitement pour la laisser gérer les événements de l'interface utilisateur. P>
Comme @RJH et @georg ont souligné, il existe essentiellement deux options différentes:
Si vous faites un traitement non trivial, je vous recommanderais de déplacer le traitement à un fil. P>
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 fort>. p> Le dernier paramètre de qObject: : Connect () est un Qt :: ConnectionType A> Enum que par défaut prend en compte si des threads sont impliqués. p> Ainsi, vous devriez pouvoir créer une sous-classe simple de puis quelque part dans votre code d'interface graphique: p> QThread code> qui fait le traitement: P>