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

Qt Discussion :

Déterminer les objets visibles [Graphics View]


Sujet :

Qt

  1. #1
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut Déterminer les objets visibles
    Bonjour,

    Alors j'ai une zone de dessin (GraphicsScene/GraphicsView) qui contient un ensemble d'objet qui sont des carrés pour former au final une "matrice de pixel" ; au départ tous les pixels sont visibles dans la zone mais je peux effectuer un zoom et par conséquent ne voir qu'un sous ensemble des pixels.

    Pour donner un maximum d'indice, les pixels sont des objets d'une classe qui hérite de la classe QGraphicsObject (class Pixel : public QGraphicsObject).

    J'aimerais donc savoir comment on peut connaître les pixels dessinés car visible dans la zone de dessin et ceux qui le sont pas.
    J'ai fait énormément de test en pensant récupérer le rect() de la scène mais après un zoom le rectangle n'évolue pas etc...

    Là seul chose que j'ai pu remarquer c'est que Qt sait très bien les pixels qu'il doit dessiner et ceux qu'il doit pas car seulement la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void paint(QPainter* painter,
                   const QStyleOptionGraphicsItem* item,
                   QWidget* widget) override;
    des pixels visibles est appelés... j'aimerais donc comme Qt connaître la liste des pixels visibles ou non

    Merci d'avance.

    PS : Pour se faire une idée, vous pouvez regarder l'exemple Qt 40.000 chips qui est un peu le même principe.

  2. #2
    Membre éclairé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Par défaut
    Bonjour,

    Ça n'est pas rect() qu'il faut utiliser, mais sceneRect().
    rect() concerne le widget.

    Le signal sceneRectChanged permet d'avertir de la nouvelle zone affichée.

    Bien à toi !

  3. #3
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Merci pour la réponse mais j'avais déjà testé et malheureusement le signal n'est jamais émis lorsque j'effectue un zoom ou une translation sur la scène.

    J'ai refais un test rapide en faisant ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    leftScene = new QGraphicsScene(this);
    connect(leftScene, SIGNAL(sceneRectChanged(QRectF)),
              this, SLOT(test(QRectF)));
    dans ma classe MainWindow pour voir ce qui se passe et le slot test n'est jamais appelé lorsque j'effectue un zoom à la molette ou une translation.

  4. #4
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Je commence à croire que c'est impossible de faire ce que je demande et pourtant Qt le fait très bien puisqu'il appelle seulement les méthodes paint() de mes éléments visibles (qui héritent de QGraphicsObject) donc lui il est complètement au courant des items visibles ou non...
    De plus quand je lis dans http://qt-project.org/doc/qt-4.8/qgr...html#isVisible => "Note that the item's general visibility is unrelated to whether or not it is actually being visualized by a QGraphicsView." ; justement c'est ce que je voudrais connaître, si l'item est actuellement visualisé (mais réellement visualisé ; donc que je le vois sur mon écran) dans la QGraphicsView.

    Pour l'instant, je n'ai toujours pas trouvé une méthode qui me permet d'avoir cette information, puisque lorsque je zoom ou translate ma scène, toutes les informations que je récupère à partir de méthode telle que sceneRect() ou autre, me donne une zone qui ne change jamais (en gros la zone de départ).

    Si il le faut je peux faire une capture de mon appli avant et après zoom

  5. #5
    Membre éclairé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Par défaut
    Bonjour,

    La dernière fois je t'ai répondu sans tester. Pour moi sceneRect et sceneRectChanged sont la solution à ton problème.

    Mais en cherchant sur internet je trouve que le problème n'est pas aussi automatique que cela. Je n'ai malheureusement pas d'environnement pour tester actuellement. Je te renvoie vers un fil de discussion qui pourrait t'aider.

    Bien à toi.

  6. #6
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Oh merci beaucoup, c'est exactement ce que je voulais !!! Je suis en train de faire des tests pour être sûr mais à priori ça fonctionne carrément. Je reviendrais demain pour mettre en résolu et mettre le code que j'ai pondu, si jamais cela peut aider

    Merci de ta réponse en tout cas.

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    La fonction items ne répond pas à ton besoin ? http://qt-project.org/doc/qt-4.8/qgr...w.html#items-5

  8. #8
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Ouai elle y réponds mais seulement une fois que j'ai déterminé la zone qui est visible. Et c'est surtout cela qui me manquait mais logiquement maintenant c'est bon
    Comme prévu, demain quand je serais de nouveau au taf, je mettrais résolu avec l'extrait de code.

  9. #9
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Qu'appelles tu zone visible ? Attention, il y a plusieurs fonctions items, celle que j'ai linké est celle de le vue (donc des éléments visibles), il suffit de l'utiliser avec sceneRect

  10. #10
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Si je dis pas de bêtises, après un zoom où je ne vois que quelques éléments, items me retournent tous les éléments. En ce qui concerne sceneRect(), quoique je fasse (translation ou zoom), le rectangle qui m'est retourné est toujours de la même taille.

    Par contre là, j'ai utilisé une méthode comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    QRectF getVisibleRect()
    {
        QPointF A = mapToScene(QPoint(0,0)); 
        QPointF B = mapToScene(QPoint(viewport()->width(), viewport()->height());
     
        return QRectF(A, B);
    }
    Puis je peux utiliser la fonction items comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QList<QGraphicsItem*> pix = items(mapFromScene(getVisibleRect()));
    Et là ça fonctionne très bien, si j'ai seulement deux éléments de visible, j'ai ces deux éléments dans la QList.

    PS : Le code que je donne est dans une classe qui hérite de QGraphicsView.

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

Discussions similaires

  1. [Débutant] Déterminer les contours d'une zone dans un objet 3D
    Par MTN84 dans le forum MATLAB
    Réponses: 2
    Dernier message: 20/08/2009, 09h17
  2. Réponses: 16
    Dernier message: 06/06/2007, 12h42
  3. Réponses: 3
    Dernier message: 23/04/2007, 13h29
  4. Rafraichissement de la fiche ainsi que de tous les objets
    Par portu dans le forum Composants VCL
    Réponses: 7
    Dernier message: 06/01/2004, 00h25
  5. determiner les ligne visible ds un RichEdit
    Par hhfr dans le forum Composants VCL
    Réponses: 4
    Dernier message: 19/09/2002, 18h15

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