IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Update nécessaire mais refusé car "dirty"

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 76
    Par défaut Update nécessaire mais refusé car "dirty"
    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

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Par défaut
    Normalement, si ton item est visible au moment de l'update tu dois alors passer dans le paint event de l'item lorsque Qt traitera les affichages.

    Pour que l'item soit visible, il ne doit pas être caché derrière un autre, il doit avoir un "boundingRect" correct, et doit se trouver dans la zone de la scene visualisée par un viewport;

    Est-ce que le bounding rectangle de ton item est mis à jour avant l'appel à update ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 76
    Par défaut
    Bonjour ness522,

    En effet, avant de déclencher l'update, j'ai vérifié 2 choses :
    - mon QObject et son parent QGraphicsItem sont visibles ;
    - boundingRect() ne renvoie pas un Rect null pour ces 2 objets.

    Ce que je ne comprends pas, c'est par exemple si mon Rect devient null, la valeur de dirty passe à 1, mais itemUpdated est quand même appelé.
    Alors que si dirty est passé à 1 précédemment, il ne reteste pas le Rect, il zappe directement l'update via discardUpdaterequest, jusqu'à ce que dirty repasse à 0 je ne sais comment...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 76
    Par défaut
    Pour m'assurer de la visibilité de mes objets, j'ai utilisé un setVisible(true). Il n'y a pas d'objet devant car rien n'est modifié après la mise à jour de mon image.

    C'est d'ailleurs le problème, semble-t-il, puisque si le chargement de l'image est fini avant que l'ensemble des objets soient affichés, tout se passe bien : les paramètres de mon QObject sont mis à jour, et mon image est dessinée quand vient son tour, je suppose.
    Mais si mon signal de fin de chargement de l'image est reçu après ... patatra, l'update() est rejeté.

    Il me faut alors attendre une nouvelle demande de mise à jour non rejetée pour que mon image apparaissent enfin.

    Dois-je en conclure que personne ne sait comment Qt fait pour se dire qu'il doit ré-évaluer ses objets, après que ceux-ci aient acquis un des paramètres problématiques testés dans discardUpdateRequest ?

  5. #5
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Par défaut
    Là comme ça difficile à dire, je n'ai jamais beaucoup été à l'intérieur de Qt donc je ne sais pas trop en effet.

    Mais d'une part on a pas de code à tester, tu utilises Qt 4.5 il y a surement eu des corrections de bugs depuis, et en plus tu utilises une version customisée de Qt.

    Si tu arrives à nous faire un projet minimaliste qui compile et reproduit le problème on pourrait alors tester aussi...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 76
    Par défaut
    Citation Envoyé par ness522 Voir le message
    Là comme ça difficile à dire, je n'ai jamais beaucoup été à l'intérieur de Qt donc je ne sais pas trop en effet.
    Si je peux pas compter sur toi...

    Citation Envoyé par ness522 Voir le message
    Si tu arrives à nous faire un projet minimaliste qui compile et reproduit le problème on pourrait alors tester aussi...
    Ma question est bien sur le comportement de Qt, justement parce que je serai bien incapable de refaire ce qui est fait actuellement... Et qu'en plus, même si j'arrive à refaire un code minimaliste, rien ne garantie que je reproduise mon problème ... qui arrive environ 1 fois sur 20.

    Et si tu as d'autres idées pour des méthodes permettant de "forcer" la mise à jour, je suis preneur aussi.

+ Répondre à la discussion
Cette discussion est résolue.

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo