Bonjour à vous,
Je viens vers vous car je n'arrive pas à trouver de solution avec notre expert Qt (bon, il est un peu surchargé, il faut admettre).
Pour ma part, je travaille sur un projet basé sur Qt, mais je n'utilise que les classes filles, je n'ai pas accès au code de Qt. Donc si vous voulez me renvoyer vers des sites où je peux étudier le code de Qt en passant, n'hésitez pas.
Et pour ne rien arranger, nous utilisons une version modifiée de Qt 4.5.
Mon soucis concerne l'affichage d'images. Vu que c'est un projet d'envergure, je ne pourrai évidemment pas vous donner tout le code, mais je vais expliquer la logique principale.
Logique du code :
Dans un objet comprenant pas mal de choses et héritant de QGraphicsItem, il y a un QObject fils qui contient le chemin d'une image à charger et qui est en charge de son affichage.
Pour charger les images, nous utilisons un QThread qui charge l'image et envoye un signal une fois le chargement terminé. A la réception du signal, mon QObject met à jour ses paramètres et déclenche un update().
Problème:
Parfois, cet update est ... refusé !!
L'appel à l'update de QGraphicsItem est bien fait, celui-ci appelant 2 fonctions :
- QGraphicsItemPrivate::discardUpdateRequest, qui teste pas mal de paramètres et annule l'update si un des paramètres n'est pas correcte ;
- itemUpdated qui lance l'affichage, si discardUpdateRequest n'a pas mis son véto.
Dans mon cas, le paramètre dirty a été mis à vrai, et empêche l'affichage.
Une des raisons pour lesquelles il peut devenir vrai, c'est si le Rect() est null, ce qui est le cas avant le chargement de mon image.
Mais malgré la mise à jour de mon objet, je n'arrive pas à déclencher l'affichage !!
Et si un nouvel affichage est demandé plus tard, alors l'affichage se déroulera correctement.
Solutions testées qui ne fonctionnent pas :
- update() x2
- prepareGeometryChange dans le QGraphicsItem parent (après la demande de chargement -envoi de la requête au QThread-, pas "avant" la modification -réception du signal de fin de chargement-)
Solutions testées qui fonctionnent mais ne conviennent pas :
- déclenchement d'un nouvel update() après un timer donné.
Questions :
- Que connaissez-vous comme méthode pour préciser à Qt que l'objet a changé et qu'il doit reconsidérer ses paramètres afin de vérifier s'il doit l'afficher ou non ?
- Quelles sont les fonctions de Qt qui ré-initialisent les paramètres d'affichage ? Car ils doivent bien être re-initialisé à un moment ou un autre, non ?
Merci d'avance pour toute l'aide que vous pourrez m'apporter.
Respectueusement,
Cyborg
Partager