QProgressBar ne montre pas de progrès?
Mon premier naïf à la mise à jour de ma barre de progression a été d'inclure les lignes suivantes dans ma boucle qui est en train de faire le traitement, de faire quelque chose comme ceci:
while(data.hasMoreItems())
{
doSomeProcessing(data.nextItem())
//Added these lines but they don't do anything
ui->progressBar->setValue(numberProcessed++);
ui->progressBar->repaint();
}
J'ai pensé à l'ajout de la repaint()
rendrait l'exécution pause tandis qu'elle mise à jour de l'interface graphique, mais apparemment il n'est pas simple. Après avoir examiné les questions suivantes:
QProgressBar Erreur
La barre de progression n'est pas de montrer les progrès réalisés
on dirait que je vais devoir mettre le traitement des données dans un thread différent, puis connecter un signal à partir du traitement des données thread le thread GUI pour mettre à jour la barre de progression. Je suis plutôt pas d'expérience avec les Interfaces graphiques et les threads et je me demandais si quelqu'un pourrait juste me pointer dans la bonne direction, c'est à dire que des classes Qt devrais-je être à la recherche à utiliser pour cela. J'avais suppose que j'ai besoin d'un QThread objet, mais j'ai été à la recherche par le biais de la QProgressBar de la documentation, mais il ne veut pas aborder le sujet de l'enfilage.
Vous devez vous connecter pour publier un commentaire.
Comme @rjh et @Georg ont souligné, il existe essentiellement deux options différentes:
Si vous faites des non-trivial de traitement, je vous recommande de déplacer le traitement à un fil.
La chose la plus importante à savoir à propos des threads est qu'à l'exception de l'interface graphique principale fil (que vous n'avez pas de début ni de créer), vous pouvez ne jamais mettre à jour l'interface graphique directement à partir de l'intérieur d'un thread.
Le dernier paramètre de QObject::connect() est un Qt::Type De Connexion enum que par défaut prend en considération si les threads sont impliqués.
Ainsi, vous devriez être en mesure de créer une sous-classe de
QThread
qui ne le traitement:Et puis, quelque part dans votre code GUI:
Vous devez appeler
QApplication::processEvents()
périodiquement à l'intérieur de votre boucle de traitement de la laisser gérer les événements de l'UI.Comme Georg dit, Qt est un single-threaded co-operative environnement multitâche. Vous obtenez le plein contrôle de votre processus jusqu'à ce que vous renoncez volontairement à processEvents() - jusqu'à ce que vous le faites, Qt ne peut pas mettre à jour les éléments de l'INTERFACE utilisateur, poignée asynchrone des requêtes HTTP, poignée de saisie, ou n'importe quoi d'autre. C'est à vous de faire en sorte que les choses deviennent un timeslice pendant que vous êtes dans une longue boucle de traitement.
Vous pouvez créer une sous-classe de
QThread
qui émet un signalprogressChanged
, qui vous vous connectez à l'QProgressBar
.connect()
rend les connexionsauto connections
par défaut. Cela signifie que le signal-slot-mécanisme déjà s'occupe des problèmes de threading pour vous, donc vous n'avez pas besoin de s'inquiéter à ce sujet.