QT Repaint / Redraw / Mettre à jour / Faire quelque chose
Je suis Nouveau sur QT. Je comprends que vous pouvez forcer un rafraîchissement d'affichage, mais j'ai retiré tous mes cheveux à essayer de comprendre comment. Voici ce que je suis précisément en essayant de faire.
J'appuie sur un bouton (onClick signal de l'événement), qui exécute le code qui change l'image (QLabel) sur l'écran, l'attente pour l'entrée, et se poursuit ensuite par la modification d'une nouvelle image (différents QLabel). J'ai tout essayé et l'affichage n'est pas de rafraîchissement jusqu'à ce que le onclick du signal de code d'événement est complet. Maintenant, je ne suis pas d'attente pour l'entrée d'utilisateur, je suis en utilisant usleep(~500 ms) pour des fins de test.
De ce que j'ai lu, QT est régie par les événements sens que je suis à la base de la création d'un tas d'événements, qui se mettre dans un québec, et exécutée lorsque l' (onClick signal d'événement) renvoie à l' (boucle principale)/(event handler). Je ne veux pas attendre jusqu'à ce que la fonction est terminée, il va faire de la programmation extrêmement douloureux si je dois accomplir cette routine entièrement basé sur les événements.
Comment puis-je forcer le QLabel pixmap pour se rafraîchir. J'ai tout essayé. Ci-dessous est tout le code que j'ai essayé dans mon onClick signal de gestionnaire d'événements. (upButton est le nom de la QLabel qui est un pixmap)
update();
repaint();
ui->upButton->setUpdatesEnabled(TRUE);
update();
repaint();
QPaintEvent paintevent(ui->upButton->childrenRegion());
QPaintEvent * test = &paintevent;
paintEvent(test);
this->changeEvent(test);
ui->upButton->update();
ui->upButton->repaint();
ui->upButton->repaint(ui->upButton->childrenRegion());
repaint();
QApplication::sendPostedEvents();
this->parentWidget()->update();
usleep(100000);
Comme vous pouvez le voir, je suis juste prise de vue dans le noir à ce point. J'ai essayé de regarder les exemples de code et de faire tous mes devoirs, mais je suis perdu. D'apprécier l'aide, des conseils ou des exemples de code.
source d'informationauteur Jason Kotzin
Vous devez vous connecter pour publier un commentaire.
J'ai été en utilisant le sommeil pour émuler une brève quantité de temps que l'ordinateur était en attente que quelque chose arrive.
Comme je l'ai dit dans ma question, je ne voulais pas utiliser les événements parce que c'est beaucoup de travail inutile pour accomplir quelque chose d'extrêmement simple.
Aussi, l '"événement" qui doit avoir lieu pour que le programme puisse continuer, est un USB de l'événement. Depuis que je suis en utilisant une classe HID périphérique, il n'y a aucun moyen de définir un événement de se produire sans une boucle d'attente. USB HID classes ne permet pas de réglage interruptions, l'OS de revendications de l'appareil.
J'ai réussi à obtenir la ci-dessus pour travailler. Je me promenais dans le débogueur et a remarqué que l'écran serait actualisation de la fonction de veille. L'exécution du programme de façon indépendante, j'ai obtenu des résultats aléatoires avec l'affichage rafraîchissante 1% du temps. Je me suis débarrassé de la fonction de veille, et ajouté quelques autres dans le code du lieu d'émuler un retard, et il était beau.
Juste pour tout le monde de la connaissance, c'est possible, il n'est pas interdit, et c'est facile à faire avec les éléments suivants:
qApp est un global variable externe dans le QApplication en-tête.
Parce que cette clé USB événement est de faire mon flux délicat, je suis tombé sur le QWaitCondition Classe. J'allais commencer un processus d'attente pour la clé USB de l'événement. Je voudrais attendre jusqu'à ce que le processus libère de la condition d'attente pour ma routine pour continuer.
Mais si quelqu'un pense que c'est une mauvaise idée, s'il vous plaît, parler. J'apprécie vraiment vos commentaires PiedPiper et Hostile à la Fourchette.
Merci.
Vous ne devriez pas être en attente d'entrée dans votre gestionnaire d'événements. Vous avez besoin de repenser la logique de votre programme pour utiliser les événements de la façon dont ils ont été destinés. Toutes les mise à jour() et repaint() appelle dans votre code sont inutiles si vous revenez à la boucle d'événements.
J'ai remarqué que parfois, lorsque vous avez de multiples couches de widgets ou des widgets à l'intérieur de widgets, il permet d'appeler leur repaint() des événements.
Par exemple
C'est bien plus facile, puis en les poussant hors de tout traitement à un autre Thread, ou créer d'autres gestionnaires d'événements.
Si j'ai bien compris, vous avez une fente et dans ce fente, vous mettez à jour l'image affichée dans un QLabel. Mais vous voulez que ce changement sera affiché avant la fente de finitions.
Si c'est le cas, la question d'une mise à jour() de l'événement, et d'appeler qApp->processEvents(). Cette méthode traite les événements qui sont en attente dans la file d'attente d'événements, puis renvoie, donc c'est peut être ce que vous êtes après.
PS: une mise à jour() peut ne pas être nécessaire à tous, je ne suis pas sûr.