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 :

Dessiner un QWidget dans un QScrollArea

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Par défaut Dessiner un QWidget dans un QScrollArea
    Je vous explique mon problème

    J'ai un QScrollArea qui contient un QWidget qui représente un graphe
    Donc au moment du chargement du fichier, on ajoute des arcs (QPushButton) et des nœuds (QWidget). Pour ca aucun problème

    Ensuite, on peut rajouter un arc entre un nœud, et un noeud qui peut être situé au dessus.

    Donc la méthode normale :

    On clique sur on noeud. A ce moment la, un paramètre selected change pour le noeud, je rappelle son paintEvent, et il est dessiné différemment (entouré de vert).

    Quand un noeud a été cliqué, tous les arcs possibles sont affichés à l'écran. On rajoute des AddableEdge, qui sont des QWidget aussi.

    Hors d'un scrollArea cela marche sans problème
    Par contre, une fois que l'on est dans un QScrollarea, si le viewport() ne contient pas le haut du graph, les arcs ne sont pas affichés, et je dois remonter complètement le qscrollarea pour que ce soit visible

    Apparemment ca ne serait pas un problème de painter(wiewport()) car je ne dessine pas directement dans le qscrollarea.

    Je précise aussi que lorsqu'on ajoute tous les AddableEdge, le plus grand arc remonte jusqu'en haut du scroll, peut être une piste...

    Je mets pas de code parce qu'il est long et dégueulasse :/

    Merci d'avance !

  2. #2
    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 LaLoutre

    Que dire, à part qu'il y a peut être un problème dans ton code et que donc sans ton code, ça va être dure de trouver le problème...

    Si ton code est "dégueulasse", peut être faut-il commencer par là ? Avec du code propre, ton erreur sera peut être bien visible ?

    Sinon, regarde du coté des QGraphics. Ça sera peut être plus simple à créer un graphe avec.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Par défaut
    En fait (si j'ai bien compris ce que c'est QGraphics ) on parle pas de la même sorte de graph. Moi je parle de graph (de la théorie des graphes) donc des noeuds reliés par des arcs...

    J'vais essayer de vous selectionner les parties de code

    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 GraphView::AddEdgeClicked()
    {
        resetAction();
        if(mode == 0)
        {
            QPushButton* b  =(QPushButton*)(sender());
            b->setCheckable(true);
            b->setDown(true);
            QString tmp = QString();
            tmp.append(QString::fromUtf8("Click sur add edge"));
            debug->appendPlainText(tmp);
            for(int i = 0; i < nbNodes; i++)
            {
                QObject::connect(nodes[i], SIGNAL(clicked()), this, SLOT(viewAddableEdges()));
            }
            mode = 1;
        }
        else
        {
              resetAction();
        }
    }
    Ici on clique sur on bouton, du coup on ajoute un eventlistener sur tous les noeuds

    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 GraphView::viewAddableEdges()
    {
        if(mode == 1)
        {
            GCP_Node* n  =(GCP_Node*)(sender());
            selectedNode = n;
            printAllAddablesEdges(n);
     
            QString tmp = QString();
            tmp.setNum(n->getIndex());
            debug->appendPlainText(tmp);
     
            mode = 2;
        }
    }
    Ici la fonction qui est appelée sur un noeud, et qui affiche tous les noeuds affichables

    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 GraphView::printAllAddablesEdges(GCP_Node* n)
    {
        GraphView* graph = this;
     
        for(int i = 0; i < n->getIndex(); i++)
        {
            // Vérifier si is_addable
            if(s->get_graph().is_addable_bck_arc(n->getIndex(),i) && !(n->isLast() && i == 0) && !(n->getIndex()== i))
            {
                GCP_EdgeAddable* edge = new GCP_EdgeAddable(this,n,nodes[i],graph);
                n->setSelect(true);
                n->repaint();
                edgesAddable[nbEdgesAddable] = edge;
                nbEdgesAddable++;
                edge->setObjectName("edge");
                edge->show();
                QObject::connect(nodes[i],SIGNAL(clicked()),this,SLOT(addEdgeOnClick()));
            }
        }
     
        graph->repaint();
    }
    Ci dessus, la fonction qui créé trous les edgesAddable (donc ceux qui ne s'affichent pas) et qui ajoute les eventlistener

    Et pour finir, le paintEvent

    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
    void GCP_EdgeAddable::paintEvent ( QPaintEvent * event )
    {
        QPainter painter(this);
     
        int departx = node_arrive->getX();
        int departy = node_arrive->getY();
        int arrivex = node_depart->getX();
        int arrivey = node_depart->getY();
     
        int diametre = graph->getDiametre();
        int espacement = graph->getEspacement();
     
        int degree = node_depart->getIndex() - node_arrive->getIndex();
     
        painter.setPen(QColor::QColor(0,255,0));
     
        painter.drawLine(7,diametre/2+5,degree*espacement+10,diametre/2+5);
     
        painter.drawLine(0,diametre/2+5,13,diametre/2-2);
        painter.drawLine(7,diametre/2+5,13,diametre/2-2);
     
        painter.drawLine(0,diametre/2+5,13,diametre/2+12);
        painter.drawLine(7,diametre/2+5,13,diametre/2+12);
     
        painter.drawLine(degree*espacement+10,diametre/2+5,degree*espacement+10,arrivey-departy+5);
     
        painter.drawLine(0,arrivey-departy+5,degree*espacement+10,arrivey-departy+5);
        this->setGeometry(departx+diametre,departy+3,arrivex+degree*espacement+11,arrivey-departy+diametre/2);
     
    }
    Voila voial, c'est a peu pret tout...

Discussions similaires

  1. Comment dessiner une ligne dans un Chart ?
    Par libititi dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2005, 14h56
  2. [ALGO] dessiner un triangle dans le bon sens
    Par lefait dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 05/02/2005, 14h38
  3. dessiner un tableau dans WORD?
    Par sali dans le forum VBA Word
    Réponses: 2
    Dernier message: 26/01/2005, 14h11
  4. Dessiner une ligne dans un cube transparent ?
    Par Muetdhiver dans le forum OpenGL
    Réponses: 4
    Dernier message: 04/05/2004, 11h06
  5. [PaintBox] Persistance du dessin non créé dans onPaint
    Par princesse dans le forum C++Builder
    Réponses: 10
    Dernier message: 21/04/2004, 17h47

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