2010-11-09 2 views
1

J'utilise une bibliothèque tierce à partir de laquelle je veux donner un rappel à l'interface utilisateur (écrit en qt) sur certains événements. J'inscris le rappel avec le pointeur de fonction de l'IU mais quand j'obtiens le rappel j'obtiens l'erreur suivante "QObject :: startTimer: QTimer peut seulement être employé avec des discussions commencées avec QThread" et "QPixmap: Il n'est pas sûr d'utiliser pixmaps en dehors du thread GUI " et la faute de segmentation.Fonction de rappel à Qt UI à partir de classes non-ui

J'ai cherché et trouvé que je ne peux pas appeler les fonctions de l'interface utilisateur directement comme on l'appelle dans un autre thread

Je voulais savoir comment puis-je enregistrer la fonction de rappel pour mettre à jour l'interface utilisateur.

Répondre

0

Eh bien, il semble que vous avez besoin de deux choses:

  1. Mettre en place une classe non-GUI QObject avec des signaux et des emplacements pour les callbacks.
  2. Assurez-vous que cette classe et/ou ses fonctions sont appelées/créées à partir du thread graphique principal du programme, éventuellement en tant que membre de données (pointeur) qui existe tant que le programme s'exécute.

Je pense que cela résoudrait les problèmes d'interopérabilité.

+0

La classe ne sera pas forcément dans le même fil. C'est sur les pouvoirs du signal/slots. – ypnos

+0

J'ai créé une nouvelle classe et une fonction statique en lui passant son pointeur sur la fonction de rappel mais elle donne toujours la même erreur. J'appelle juste la fonction de rappel et j'imprime une trace et je ne mets même pas à jour ui maintenant. – prasad

+0

@ypnos: Je le pensais, mais apparemment, l'OP en avait besoin dans le même fil ... votre solution semble meilleure cependant :) – rubenvb

1

La solution est triple:

  • Utilisez QThread instancier votre thread de travail.
  • Utilisez QImage au lieu de QPixmap. Les QPixmaps sont stockés dans le sous-système graphique et donc contrôlés par le thread principal (GUI). QImages vivent en mémoire et peuvent être tenus par n'importe quel fil.
  • Utilisez le concept de signal/emplacement. Il est légal d'émettre un signal provenant d'autres threads que le thread principal.

Seulement si vous souhaitez également recevoir des signaux dans votre thread de travail, par ex. rétroaction de l'entrée de l'utilisateur (comme bouton "annuler"), vous avez également besoin d'une boucle d'événement QT dans votre thread de travail. Votre QTimer a gagné # t travail si elle doit déclencher un emplacement dans le thread de travail sans boucle d'événement.

Lire http://doc.trolltech.com/4.5/threads.html

Questions connexes