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 :

Utiliser QPainter dans une grille


Sujet :

Qt

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Points : 131
    Points
    131
    Par défaut Utiliser QPainter dans une grille
    Bonjour,
    Je dessine des rectangle dans une grille, et je peux les déplacer avec la souris pour changer la position du rectangle. Mais le rectangle doit toujours contenir dans la grille, donc si je glisse le rectangle de gauche vers la droite, arrive à la fin de la grille, les parties du rectangle ne pouvant pas apparaitre dans la même ligne doit apparaitre à la ligne suivante. C'est a dire arrivé à la fin de la première ligne je peux faire apparaitre une partie de mon rectangle à la case 33 sur la figure jointe, et si je glisse encore ma souris ça continu à la case 34, jusqu'à ce qu'il apparait totalement à la deuxième ligne.
    Si quelqu'un a une idée pour m'aider svp.

    Merci d'avance.
    Images attachées Images attachées  

  2. #2
    Membre éprouvé

    Profil pro
    Responsable logiciel
    Inscrit en
    Octobre 2010
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable logiciel

    Informations forums :
    Inscription : Octobre 2010
    Messages : 223
    Points : 1 183
    Points
    1 183
    Par défaut
    Si ton rectangle ne peut bouger que de gauche à droite, une idée (relativement) simple à implémenter serait d'avoir, en plus de la vue que tu présente, un curseur de commande de ton widget qui représenterait le widget en miniature affiché sur une seule ligne. La vue principale serait alors un zoom découpé en lignes du curseur de commande.

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Points : 131
    Points
    131
    Par défaut
    Mon rectangle bouge dans tous les sens , sauf que dans ce cas de figure présenté, si je le bouge jusqu'à ce qu'il sort de la grille il doit être redessiné sur la ligne suivante.J'espère que je me suis bien fait comprendre.

    Merci pour ta réponse.

  4. #4
    Membre éprouvé

    Profil pro
    Responsable logiciel
    Inscrit en
    Octobre 2010
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable logiciel

    Informations forums :
    Inscription : Octobre 2010
    Messages : 223
    Points : 1 183
    Points
    1 183
    Par défaut
    Citation Envoyé par lisco Voir le message
    Mon rectangle bouge dans tous les sens , sauf que dans ce cas de figure présenté, si je le bouge jusqu'à ce qu'il sort de la grille il doit être redessiné sur la ligne suivante.J'espère que je me suis bien fait comprendre.

    Merci pour ta réponse.
    Dans ce cas, pas trop le choix, il faudrait gérer le débordement en masquant la partie extérieure du rectangle et en reportant la partie masquée sur la ligne suivante.

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Points : 131
    Points
    131
    Par défaut
    C'est exactement ça. J'arrive à masquer la partie qui deborde mais j'arrive pas à le redessiner sur la ligne suivante. Sachant que que je bouge le rectangle les 2 parties doivent bouger comme en un seul 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
    20
    21
    22
    void Maclass::dragMoveEvent(QDragMoveEvent *event)
    {
     
        QRect updateRect =rect1;
     
        if (event->mimeData()->hasFormat("image/x-exple-piece")
          {
            QRect recta = QRect(event->pos().x()/25*25, event->pos().y()/30 * 30,25, 30);
            QRect rectb = QRect(recta.x(), recta.y(), 25, 30);
            QRect rectc = QRect(rectb.x(), rectb.y(), 25, 30);
            rect1 = QRect(recta.x(), recta.y(), recta.width()+rectb.width()+rectc.width(), 30);
     
            if((event->pos().x()/25 * 25 + rect1.width()) > (800))//test du debordement.
            {
     
                rectd = QRect (0, (event->pos().y()+30)/30*30, 25, 30);//partie debordante su rla ligne suivant.
            }
     
            event->setDropAction(Qt::MoveAction);
            event->accept();
     
    }
    ensuite j'ai une méthode QPainter qui dessine mon rectangle.
    Tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    painter.drawRect(rect1);

  6. #6
    Membre éprouvé

    Profil pro
    Responsable logiciel
    Inscrit en
    Octobre 2010
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable logiciel

    Informations forums :
    Inscription : Octobre 2010
    Messages : 223
    Points : 1 183
    Points
    1 183
    Par défaut
    Je ne suis pas sûr que tu aies intérêt à faire le clipping dans la méthode dragMoveEvent, il devrait être possible de tout faire dans le paint (calcul du découpage et dessin). Ca serait plus propre et plus facile à analyser en cas de problème.

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

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

    Je reviens encore parce que j'ai toujours pas trouvé mon bonheur.je joins une image de ce que je voudrais avoir pour bien expliquer mon problème. J'espere bien que c'est possible de le faire en Qt. J'ai un rectangle que je drag (je déplace) dans une grille mais sauf que arrivée à la fin de la grille le rectangle doit continuer à se dessiner sur la ligne suivante comme sur l'image exemple.
    Mais dans mon cas ça le fait pas(voir image monProg).

    voici comment je fais mon painter:

    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
    31
    32
    33
    void Appli::paintEvent(QPaintEvent *event)
    {
        QPainter painter;
        painter.begin(this);
     
     
        for(int x = 0; x <= 32; x++)
        {
            painter.drawLine(25 * x  ,this->rect().width(), 25 * x, 0);
     
        }
     
        for(int y = 0; y <= 16; y++)
        {
            painter.drawLine(this->rect().width(), 30 * y, 0, 30 * y);
     
        }
     
        for(int i = 0; i < 512; i++)
        {
            QRect rect;
            rect = GetRectItem(i);
            painter.drawText(rect, Qt::AlignCenter, QString("%1").arg(i+1));
     
         }
     
            painter.setBrush(QColor(178,178,178));//couleur du rect
            painter.setPen(Qt::darkGray);
     
     
            painter.drawRect(rect1);
            painter.fillRect(rect1, Qt::darkGray);
    }
    Et le rect est calculé suivant la position de la souris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    const QRect Appli::GetRect(const QPoint &position)
        {
     
            rect1 = QRect(QPoint(position.x()/25 * 25, position.y()/30 * 30), QSize(125, 30));
     
            return rect1;
     
        }
    Svp si vous avez des idées je suis preneur .

    Merci d'avance.
    Images attachées Images attachées   

  8. #8
    Membre éprouvé

    Profil pro
    Responsable logiciel
    Inscrit en
    Octobre 2010
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Responsable logiciel

    Informations forums :
    Inscription : Octobre 2010
    Messages : 223
    Points : 1 183
    Points
    1 183
    Par défaut
    C'est bizarre, apparemment rect1 est une variable membre, mais est retournée par GetRect(), c'est exprès ?
    Sinon pas de raison que ça ne marche pas, mais il manque une partie du code, donc pas facile de suivre précisément ce qui se passe.

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 237
    Points : 131
    Points
    131
    Par défaut
    merci!

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/12/2007, 10h58
  2. Utiliser ssh dans une application java
    Par Samanta dans le forum Sécurité
    Réponses: 12
    Dernier message: 28/02/2007, 16h30
  3. Réponses: 10
    Dernier message: 19/09/2005, 22h24
  4. utiliser mysql++ dans une classe
    Par Yevetrovitch dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 11/04/2005, 10h53
  5. [Debutant(e)]Quel composant utiliser pour faire une grille
    Par elitost dans le forum Composants
    Réponses: 7
    Dernier message: 21/06/2004, 20h44

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