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 :

Problème avec QRect


Sujet :

Qt

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Par défaut Problème avec QRect
    Bonjour, Je dessine un rectangle dont la longueur peut varier dans une grille.Mon rectangle ne peut contenir que dans la grille, si la longueur depasse alors le reste est dessiner sur la ligne suivante comme dans le figure 1.
    Mon probléme j'arrive pas à le faire avec QRect.operator |= (QRect) , figure 2, car il me dessine le rectangle englobant alors que c'est pas ce que je veux.
    Voici ma fonction qui dessine le rectangle :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void Appli::DrawRect(QPainter *painter, CDrawr* pFixture)
    {
     
        QRect rect1 = GetRectItem(CDrawr->m_address - 1);
        QRect rect2;
     
        for(int iChan = CDrawr->m_address + 1; iChan <= CDrawr->m_endAddress; iChan++)
        {
            rect2 = QRect(GetRectItem(iChan));
            rect1.operator |=(rect2);
     
        }
     
         painter->fillRect(rect1, Qt::darkGray);
     
     
     
     
    }
    il englobe les 2 lignes sur lesquelles les rects sont contenus, alors j'aimerais avoir uniquement les rects associés les uns apres les autres sur les lignes sans toucher à la hauteur.

    Merci de votre help!

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Tu ne peux pas dessiner la forme voulue avec un seul rectangle. Dans ta représentation, ton rectangle "va à la ligne", mais pour la machine, un rectangle est un truc qui à 4 coins et 4 côtés sur ton écran (hors le tien a en réalité 8 coins et 8 côtés).

    Et sinon (je n'ai pas lu la doc), mais es tu sûr que l'operateur | réalise l'intersection des deux recrangles ? Pour moi, cela retournerait plutôt l'union des 2.

    G.

  3. #3
    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
    Bonjour lisco

    Votre question ressemble beaucoup à celles que vous avez déjà posées concernant ce problème. Donc, avec l'impression de se répéter :

    un QRect est... un rectangle ! Pas un ensemble de rectangle. Pas un objet graphique visible à l'écran. Comme le dit Gulish, un rectangle "est un truc qui à 4 coins et 4 côtés". Point.

    Si vous voulez manipuler un ensemble de rectangle, vous pouvez utiliser une liste de rectangle ou une région (QRegion). Mais pas un QRect.

    Donc comprenez bien que lorsque vous dites :
    Je dessine un rectangle ...
    vous concevez très mal votre problème (et donc, vous ne pouvez pas le résoudre). Ce que vous souhaitez en fait, c'est de dessiner un objet graphique qui représente un ensemble de plusieurs rectangles.

    Si vous avez compris cela, il ne reste plus qu'a modifier votre code en conséquence.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    vous concevez très mal votre problème (et donc, vous ne pouvez pas le résoudre). Ce que vous souhaitez en fait, c'est de dessiner un objet graphique qui représente un ensemble de plusieurs rectangles.

    Si vous avez compris cela, il ne reste plus qu'a modifier votre code en conséquence.
    C'est ce que je veux exactement, un objet graphique qui represente un ensemble de plusieurs rectangles, mais je trouve aucun moyen de le faire , enfin je suis debutant en Qt.
    Et je pense que QRegion est le meilleur moyen de le faire, j'ai essayé ceci mais ya rien qui est dessiné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void Appli::Drawrect(QPainter *painter, CDrawr* dra)
    {
     
        QRegion rgn1(rect(CDrawr->deb), QRegion::Rectangle);
        for(int i = dra->deb + 1; i <= dra->fin; i++)
            {
               QRegion  rgn2(rect(i));
                rgn1.unite(rgn2);
     
            }
     
        painter->setClipRegion(rgn1);
     
     
    }
    j'ai besoin d'un coup de pouce svp pour me debloquer.

    Merci d'avance!

  5. #5
    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
    C'est quoi pFixture, m_address, m_endAddress et GetRectItem ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    C'est quoi pFixture, m_address, m_endAddress et GetRectItem ?
    Merci j'ai réussi à le faire, ce qu'il fallait que je saisisse c'est que QRegion représente une Zone d'affichage.
    Pour revenir à votre question: pFixture c'est un objet qui a une adresse de depart c'est a dire là ou doit se placer le premier rectangle obtenu par GetRectItem(i) et m_endAddress represente le dernier rectangle !

    Une autre question, ce que j'ai fait c'est ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Appli::Drawr(QPainter *painter, CDrawr* dra)
    {
     
     
        for(int i = dra->deb+ 1; i<= dra->fin; i++)
        {
           painter->fillRect(rect(i), Qt::black);
     
         }
     
    }
    Est ce possible de faire du Drag and Drop da ma QRegion? Cad le deplacer dans ma grille?

    Encore merci!

  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
    Je n'ai pas l'impression que vous comprenez ce que vous écrivez

    Dans votre code, vous créer une région (rgn1), vous ajouter chaque rectangle dans votre région (en passant pas rgn2) et vous dessiner chaque rectangle (avec fillRect), puis à la fin vous définissez votre région de clip (ce qui sert à rien puisse que vous avez finit de dessiner)...

    Je vous encourage fortement à lire la documentation de Qt, en particulier sur le clipping, sur QRegion, sur QRect, etc.

    Au final, le code suivant fera la même chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Appli::Drawr(QPainter *painter, CDrawr* pFixt)
    {
        for(int i = pFixt->m_address + 1; i<= pFixt->m_endAddress; i++)
           painter->fillRect(GetRectItem(i), Qt::black);
    }
    Est ce possible de faire du Drag and Drop da ma QRegion? Cad le deplacer dans ma grille?
    Non. QRegion n'est pas un objet visible. Ça n'as pas de sens de parler de D&D dessus.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Par défaut
    Citation Envoyé par gbdivers Voir le message

    Est ce possible de faire du Drag and Drop da ma QRegion? Cad le deplacer dans ma grille?
    Non. QRegion n'est pas un objet visible. Ça n'as pas de sens de parler de D&D dessus.
    Je vous remercie pour vos conseils!
    ET comment je peux créer un objet visible correspondant au contenu de ma region pour que je puisse faire du D&D svp?

  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
    Un objet visible = n'importe quel objet héritant de QWidget (que ce soit un objet Qt ou un object que vous créez)

    D&D : voir la documentation

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Par défaut
    Bonjour,

    gbdivers, peut tu me filer un exemple stp où je peux avoir mes rectangles dans un objet visible pour que je puisse faire le D&D?

    Merci d'avance

  11. #11
    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
    Ce n'est pas une bonne habitude à prendre que de demander à d'autres de faire son code...

    Pour t'aider un peu, voici comment je ferais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    class Selection : public QWidget // on hérite de QWidget puisque c'est un objet visible
    {
       // gestion de la sélection
    private:
       int m_first; // indice du premier rectangle de la grille contenu dans la selection
       int m_last; // indice du dernier rectangle
    public:
       void updateRange(int first, int last); // on peut mettre à jour les indices first et last
       void translateRange(int offset); // on décale first et last et on vérifie les bornes
     
       // gestion de l'affichage des rectangles
    public:
       void paintEvent(QPaintEvent* e) // on dessine chaque rectangle entre first et last
     
       // gestion du drag&drop
    private:
       QPoint dragStartPosition;
    public:
       void mousePressEvent(QMouseEvent *); // on enregistre la position du clic
       void mouseMoveEvent(QMouseEvent *e); // si le déplacement est suffisant, on crée un object QDrag
    };
     
    class Grille : public QWidget
    {
       // gestion du drag&drop
    public:
       Grille(); // on met "setAcceptDrops(true);" pour accepter les drop
       void dragEnterEvent(QDragEnterEvent *e); // on accepte les drag venant de "Selection"
       void dropEvent(QDropEvent *event); // on calcul le déplacement et on met a jour "Selection"
    };
    Il existe d'autres méthodes pour faire la même chose, par exemple en laissant la grille gérer entièrement l'affichage.

    Bon courage

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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