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 :

Tableau bidimensionnel en paramètre d'une fonction de dessin


Sujet :

Qt

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 86
    Points : 61
    Points
    61
    Par défaut Tableau bidimensionnel en paramètre d'une fonction de dessin
    Bonsoir,



    J'ai beau esseyer , je n'arrive pas à avoir le résultat , pire , aprés compilation j'ai le résultat suivant:
    tp.exe a quitté avec le code -1073741819

    Ce que je veux faire est en fait de recueillir les données introduites dans un tableau (QTableWidget) dans une fonction "dessin" qui sera charger de mettre un segment entre deux cercles si l'element M[i][j] =1 , ne rien dessiner sinon .
    Voici le 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
     
     
     
    //  Le Header
    #ifndef ARBRE_H
    #define ARBRE_H
    #include <QtGui>
     
    class Arbre :  public QWidget
    {
    Q_OBJECT
     
    public:
    Arbre();
     
    private slots:
     
    void dessin (double [][2]);
    private:
       QTableWidget* tableWidget;
       QPushButton * m_bouton;
    void paintEvent(QPaintEvent *);
    };
     
     
     
    #endif // ARBRE_H
     
     
     
     
     
     
    // arbre.cpp
     
     
    #include "arbre.h"
    #include "math.h"
    #include <QtGui>
    Arbre::Arbre()
    {
       // setFixedSize(500,500);
        QPaintEvent *e;
        paintEvent( e);
    }
     
    void Arbre::paintEvent(QPaintEvent *e)
    {
     
          tableWidget = new QTableWidget(3, 3, this);
     
     
     
        /*QString str = tableWidget->cellWidget(1,2);
          bool ok;
           hex == 255, ok == true
          int dec = str.toInt(&ok, 10);*/
     
       // M[1][0]=tableWidget->cellWidget(1,2);
          int nbl=2;
          int nbc=2;
          int i,j;
           int M [nbl][nbc];
           for (i=0; i<nbl; i++){
               for (j=0; j<nbc; j++){
                   M[i][j] = 0;
     
               }
           }
           QPushButton *m_bouton = new QPushButton("Valider", this);
    QString recup;
    bool ok;
        recup = tableWidget->itemAt(1,2)->text();
           int dec = recup.toInt(&ok, 10);
    M[2][0]=dec;
        /*M[2][0]=1;
        M[0][2]=1;
        M[1][2]=1;
        M[2][1]=1;
        M[3][0]=1;
        M[4][0]=1;
        M[5][0]=1;*/
    QWidget::connect(m_bouton, SIGNAL(clicked()), this, SLOT(dessin(int[][])));
    }
    /////////////////////////////////////////////////////////////
     
     
     
    void Arbre::dessin(double M[][2] )
    {
        int Nb_Sommet;
        int nbl=2;
        int nbc=2;
     
        if (nbl >= nbc)
        {
            Nb_Sommet=nbl;
        }
        else
        {
            Nb_Sommet=nbc;
        }
     
     QPainter painter(this);
     int t;
     bool tour=false;
     int x=35;
     int y=45;
    int Num_Sommet=0;
     int T_Coordonnees [Nb_Sommet][2];
    for (t=0; t<Nb_Sommet; t++)
    {
     
         painter.drawEllipse(x,y,30,30);
         (T_Coordonnees[Num_Sommet][0])=x;
          (T_Coordonnees[Num_Sommet][1])=y;
     
     
        if (tour==false)
        {
            x+=85;
            tour=true;
        }
        else
        {
           y+=95;
           tour=false;
        }
    Num_Sommet ++;
    }
    int i,j;
    for (i=0; i<nbl; i++){
        for (j=0; j<nbc; j++){
            if(  (M[i][j] == 1)&&(M[j][i]==1) )
            {
     
     
                painter.drawLine((T_Coordonnees[i][0]+20),(T_Coordonnees[i][1]),(T_Coordonnees[j][0]+20),(T_Coordonnees[j][1]));
                if(  (T_Coordonnees[i][1]>45)||(T_Coordonnees[j][1]>45)  )
                {
                   painter.drawLine(((T_Coordonnees[i][0]+20)-10),(T_Coordonnees[i][1]),((T_Coordonnees[j][0]+20)-10),(T_Coordonnees[j][1]));
                }
                else
                {
                painter.drawLine((T_Coordonnees[i][0]+20),(T_Coordonnees[i][1]+30),(T_Coordonnees[j][0]+20),(T_Coordonnees[j][1]+30));
                }
            }
            else
            {
                if (M[i][j]==1)
                {
                   painter.drawLine((T_Coordonnees[i][0]+20),(T_Coordonnees[i][1]),(T_Coordonnees[j][0]+20),(T_Coordonnees[j][1]));
                }
     
            }
     
        }
    }
     /*painter.drawEllipse(35,45,30,30);
     painter.drawEllipse(120,45,30,30);
     painter.drawEllipse(35,140,30,30);*/
     
     
    }
     
     
     
     
     
     
     
    //main.cpp
     
    #include <QApplication>
    #include "arbre.h"
     
    int main(int argc, char* argv[])
    {
    QApplication app(argc, argv);
     
    Arbre fenetre;
    fenetre.show();
     
    return app.exec();
    }
    Merci d'avance pour l'attention apportée à ce message.

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonjour,

    Première remarque : qu'en est-il des magnifiques fuites de mémoire ? Vous allouez de la mémoire pour créer un tableau et un bouton à chaque passage dans paintEvent(), qui est une fonction qu'on ne doit pas appeler directement comme vous l'avez fait. Elle s'appelle par le biais d'un rafraichissement de la fenêtre via une action utilisateur d'expose ou via update()/repaint().

    Deuxième chose, la connexion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QWidget::connect(m_bouton, SIGNAL(clicked()), this, SLOT(dessin(int[][])));
    Vous vous situez dans une classe dérivée de QObject, le préfixe QWidget:: n'est pas nécessaire. De plus, le slot appelé n'a pas des paramètres correspondants au signal ; comment l'ordinateur pourrait-il savoir d'où sort ce int[][] et donc que lui donner lors d'un clic sur le bouton ? Une connexion valide, avec les deux widgets initialisés dans le constructeur et non dans le paintEvent(), serait de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(m_bouton, SIGNAL(clicked()), this, SLOT(dessin()));
    Comme vous disposez dans vos privates du QTableWidget, vous pouvez reconstituer votre int[][] dans le slot dessin() (qui ne prend pas de paramètre).

    Bonne continuation,
    Amnell.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 86
    Points : 61
    Points
    61
    Par défaut
    Merci pour réponse,
    J'ai modifier selon vos recommandations (sauf le repaint ou update que je n'ai pas su employer) et le programme ne fonctionne toujours pas .
    Je pense neanmoins que le probléme réside en le fait que je n'arrive pas prendre le contenu d'une cellule et renvoyer son contenu dans une le tableau M.
    Supposons que cela soit fait , est-ce que le contenu est de type QString dans quel cas je n'y comprendrai plus rien puisque j'ai converti la chaine en entier.
    Je vous serez vraiment reconnaissant de me donner une réponse.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 86
    Points : 61
    Points
    61
    Par défaut
    Bonjour,

    Je suis parvenu à régler le probléme d'erreur de segmentation.
    Toutefois, il n'y a que le tableau (QTableWidget) qui s'affiche , pas de bouton"Tracer" qui en cliquant dessus lancera le tracé des somment et des arrrêtes.

    Voici le code modifié:
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
     
    //LE HEADER arbre.h
     
     
     
    #ifndef ARBRE_H
    #define ARBRE_H
    #include <QtGui>
     
    class Arbre :  public QWidget
    {
    Q_OBJECT
     
    public:
    Arbre();
     
    private slots:
     
    void dessin ();
    private:
       QTableWidget* tableWidget;
       QPushButton * Tracer;
       QPainter *painter;
       int M [][2];
    void paintEvent(QPaintEvent *);
    };
     
     
     
    #endif // ARBRE_H
     
     
     
     
     
    //arbre.cpp
    #include "arbre.h"
    #include "math.h"
    #include <QtGui>
    Arbre::Arbre()
    {
      QPaintEvent *e;
     
     
      paintEvent( e);
    }
     
     
    void Arbre::paintEvent(QPaintEvent *e)
    {
       tableWidget = new QTableWidget(2,2,this);
       Tracer = new QPushButton("Tracer");
       Tracer->move(10,10);
     
       connect(Tracer, SIGNAL(clicked()), this, SLOT(dessin()));
    }
    /////////////////////////////////////////////////////////////////
     
     
     
    void Arbre::dessin()
    {
        int Nb_Sommet;
        int nbl=2;
        int nbc=2;
        int s;
        int k;
        QString str;
        for (s=0; s<nbl; s++)
        {
          for (k=0; k<nbc; k++)
          {
           M[s][k] = 0;
     
          }
        }
    str = ((tableWidget->itemAt(0,0))->text());
        int dec = str.toInt();
        (M[0][1])=dec;
     QPainter painter(this);
     int t;
     bool tour=false;
     int x=35;
     int y=45;
    int Num_Sommet=0;
    if (nbl >= nbc)
    {
        Nb_Sommet=nbl;
    }
    else
    {
        Nb_Sommet=nbc;
    }
    int T_Coordonnees [Nb_Sommet][2];
    for (t=0; t<Nb_Sommet; t++)
    {
     
         painter.drawEllipse(x,y,30,30);
         (T_Coordonnees[Num_Sommet][0])=x;
          (T_Coordonnees[Num_Sommet][1])=y;
     
     
        if (tour==false)
        {
            x+=85;
            tour=true;
        }
        else
        {
           y+=95;
           tour=false;
        }
    Num_Sommet ++;
    }
    int i,j;
    for (i=0; i<nbl; i++){
        for (j=0; j<nbc; j++){
            if(  (M[i][j] == 1)&&(M[j][i]==1) )
            {
     
     
                painter.drawLine((T_Coordonnees[i][0]+20),(T_Coordonnees[i][1]),(T_Coordonnees[j][0]+20),(T_Coordonnees[j][1]));
                if(  (T_Coordonnees[i][1]>45)||(T_Coordonnees[j][1]>45)  )
                {
                   painter.drawLine(((T_Coordonnees[i][0]+20)-10),(T_Coordonnees[i][1]),((T_Coordonnees[j][0]+20)-10),(T_Coordonnees[j][1]));
                }
                else
                {
                painter.drawLine((T_Coordonnees[i][0]+20),(T_Coordonnees[i][1]+30),(T_Coordonnees[j][0]+20),(T_Coordonnees[j][1]+30));
                }
            }
            else
            {
                if (M[i][j]==1)
                {
                   painter.drawLine((T_Coordonnees[i][0]+20),(T_Coordonnees[i][1]),(T_Coordonnees[j][0]+20),(T_Coordonnees[j][1]));
                }
     
            }
     
        }
    }
     
     
     
    }
     
     
     
     
     
     
     
     
    //main.cpp
    #include <QApplication>
    #include "arbre.h"
     
    int main(int argc, char* argv[])
    {
    QApplication app(argc, argv);
     
    Arbre fenetre;
    fenetre.show();
     
    return app.exec();
    }
    merci d'avance pour toute aide apportée .

  5. #5
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Tu n'as pas donné de parent au bouton Tracer. Tu devrais le rajouter (mettre this en parent), et donc lorsque le show() de la fenêtre sera appelé, ce sera propagé à tous les enfants dont le bouton.

    Si tu tiens à ne pas lui donner de parent, alors tu dois appeler show() dessus.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 86
    Points : 61
    Points
    61
    Par défaut
    Merci beaucoup , le boutton s'affiche enfin!!
    Cependant en mettant une valeur dans le QTableWidget dans la cas [1][2]
    et en cliquant sur le bouton le programme s'interrompt .
    Lors du debogage , j'obtiens une erreur de segmentation, et en faisant attention à la variable Num_Sommet on remarque qu'elle a une valeur tres grande alors qu'elle devrait rester à"2".
    J'ai esseyé mais le resultat reste le mêm et le programme plante aprés avoir appuyer sur le bouton.
    Voici le 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    //je n'ai changé que le arbre.cpp
    #include "arbre.h"
    #include "math.h"
    #include <QtGui>
    Arbre::Arbre()
    {
      QPaintEvent *e;
     
     
      paintEvent( e);
    }
     
     
    void Arbre::paintEvent(QPaintEvent *e)
    {
       tableWidget = new QTableWidget(2,2,this);
       Tracer = new QPushButton("Tracer",this);
       Tracer->move(10,10);
     
       connect(Tracer, SIGNAL(clicked()), this, SLOT(dessin()));
    }
    /////////////////////////////////////////////////////////////////
     
     
     
    void Arbre::dessin()
    {
        int Nb_Sommet=2;
     
        int s;
        int k;
        QString str;
        for (s=0; s<Nb_Sommet; s++)
        {
          for (k=0; k<Nb_Sommet; k++)
          {
           M[s][k] = 0;
     
          }
        }
    str = ((tableWidget->itemAt(1,0))->text());
        int dec = str.toInt();
        (M[0][1])=dec;
     QPainter painter(this);
     
     bool tour=false;
     int x=35;
     int y=45;
    int Num_Sommet=0;
     
    int T_Coordonnees [Nb_Sommet][Nb_Sommet];
    while (Num_Sommet<Nb_Sommet)
    {
     
         painter.drawEllipse(x,y,30,30);
         (T_Coordonnees[Num_Sommet][0])=x;
          (T_Coordonnees[Num_Sommet][1])=y;
     
     
        if (tour==false)
        {
            x+=85;
            tour=true;
        }
        else
        {
           y+=95;
           tour=false;
        }
    Num_Sommet++;
    }
    Num_Sommet--;
    int i,j;
    for (i=0; i<Nb_Sommet; i++){
        for (j=0; j<Nb_Sommet; j++){
            if(  (M[i][j] == 1)&&(M[j][i]==1) )
            {
     
     
                painter.drawLine((T_Coordonnees[i][0]+20),(T_Coordonnees[i][1]),(T_Coordonnees[j][0]+20),(T_Coordonnees[j][1]));
                if(  (T_Coordonnees[i][1]>45)||(T_Coordonnees[j][1]>45)  )
                {
                   painter.drawLine(((T_Coordonnees[i][0]+20)-10),(T_Coordonnees[i][1]),((T_Coordonnees[j][0]+20)-10),(T_Coordonnees[j][1]));
                }
                else
                {
                painter.drawLine((T_Coordonnees[i][0]+20),(T_Coordonnees[i][1]+30),(T_Coordonnees[j][0]+20),(T_Coordonnees[j][1]+30));
                }
            }
            else
            {
                if (M[i][j]==1)
                {
                   painter.drawLine((T_Coordonnees[i][0]+20),(T_Coordonnees[i][1]),(T_Coordonnees[j][0]+20),(T_Coordonnees[j][1]));
                }
     
            }
     
        }
    }
     
     
     
    }

    Merci de votre aide.

  7. #7
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    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
    Arbre::Arbre()
    {
      QPaintEvent *e;
     
     
      paintEvent( e);
    }
     
    void Arbre::paintEvent(QPaintEvent *e)
    {
       tableWidget = new QTableWidget(2,2,this);
       Tracer = new QPushButton("Tracer",this);
       Tracer->move(10,10);
     
       connect(Tracer, SIGNAL(clicked()), this, SLOT(dessin()));
    }
    Pourquoi paintEvent() ? paintEvent() est appelé à chaque fois que le widget demande à être repeint (par exemple, lorsqu'on déplace une fenêtre par-dessus le widget et qu'on la retire pour rendre de nouveau visible ce dernier, il va être repeint). De plus, l'appel à la fonction est fait de la mauvaise manière. Plutôt que de passer un pointeur invalide/NULL (selon la configuration) à la fonction, il aurait suffit d'appeler à la place de "paintEvent( e)" update() ou repaint().

    La bonne manière est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Arbre::Arbre()
    {
       tableWidget = new QTableWidget(2,2,this);
       Tracer = new QPushButton("Tracer",this);
       Tracer->move(10,10);
     
       connect(Tracer, SIGNAL(clicked()), this, SLOT(dessin()));
    }
     
    void Arbre::paintEvent(QPaintEvent *e)
    {
    }
    Le paintEvent() devient donc inutile et peut être retiré.

    Avec une meilleure indentation et un coding style constant, ce serait plus simple pour nous de vous aider et pour vous d'éviter d'effectuer des erreurs.

    Concernant l'erreur en question, je suppose qu'elle provient du .h, avec int M [][2]. Vu que nous sommes en C++ et non en JS/autre, on ne peut pas demander à ce que le tableau s'étende autant qu'on le veut. De ce fait, si je ne raconte pas de bêtises, la syntaxe donnée est équivalente à int *M[2] et demande donc une allocation de mémoire. Ou si vous ne souhaitez pas en effectuer, vous avez toujours à disposition des conteneurs tels que QList et QVector.

    Bonne continuation,
    Amnell.

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 86
    Points : 61
    Points
    61
    Par défaut
    Merci pour cette réponse , j'apprécie vraiment.
    J'ai effectué les changements que vous m'avez conseillé et le programme plante toujours(j'ai fixé la taille du tableau à M[2][2]).Lors du debogage les valeurs de Num_Sommets sont anormalement grandes(doit s'arreter à 2) ce qui je pense est du à une sorte de boucle infine.
    A noter que je n'ai aucune idée de la maniére dont repaint() u update() doit être utilisé.
    Je vous serai très reconnaissant de me l'indiquer.
    Merci encore une fois.

  9. #9
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Tu veux dire que la documentation n'est pas claire ?

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 86
    Points : 61
    Points
    61
    Par défaut
    Je n'aurais pas cette prétention .
    Je ne l'ai peut-être pas mentionné mais je suis encore débutant en C++ , c'est que du neuf pour moi.
    C'est donc accompagné d'une demande d'indulgence sur ce point que je vous prie de me montrer comment je pourrait coder avec update ou repaint dans mon programme , merci d'avance.

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 86
    Points : 61
    Points
    61
    Par défaut
    Bonsoir,

    Je serais reconnaissant envers celui qui pourrait m'indiquer comment utiliser update .
    J'ai esseyé en slot apres avoir cliquer sur le boutton mais ça ne marche pas .

  12. #12
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Ça marche sûrement, mais ça ne fait pas ce que tu crois. Comme le dit la documentation, on utilise update() pour forcer le redessin là où c'est nécessaire, et repaint() pour le forcer sur l'ensemble du widget. Mais tout de suite ça ne va pas t'aider.

    Tout ce qui est dessin (ta méthode dessin() quoi) est à faire dans le paintEvent(). paintEvent est une méthode événementielle, appelée uniquement par Qt donc, et dont l'appel peut être ordonnée avec update()/repaint(). C'est ce qu'Amnell a expliqué, on n'appelle pas paintEvent() directement.

    A mon avis, ce que tu veux faire, c'est quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Arbre::paintEvent(QPaintEvent *e)
    {
        dessin();
    }
    car on ne peut dessiner que dans un paintEvent (d'ailleurs tu devrais copier le contenu de la méthode dessin(), elle sert à rien).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(Tracer, SIGNAL(clicked()), this, SLOT(dessin()));
    Du coup ça c'est pas bon, ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(Tracer, SIGNAL(clicked()), this, SLOT(update()));
    Enfin, dans ton constructeur, tu n'appelles pas celui de la classe mère... Je pense que ça peut poser problème.

  13. #13
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Citation Envoyé par Troudhyl Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(Tracer, SIGNAL(clicked()), this, SLOT(dessin()));
    Du coup ça c'est pas bon, ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(Tracer, SIGNAL(clicked()), this, SLOT(update()));
    Le souci est que s'il ne souhaite pas dessiner "avant" que l'on ait cliqué sur son bouton, le paintEvent() tel que tu l'as donné risque de poser problème.

    @hichemnho> Si vous nous copiiez le code tel que vous l'avez en ce jour, en bien indenté, cela pourrait nous aider à régler le problème.

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 86
    Points : 61
    Points
    61
    Par défaut
    Bonsoir,

    Tout d'abord merci pour toute la peine que vous vous donnez pour m'aidé, ensuite voici le 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
     
    //arbre.h
    #ifndef ARBRE_H
    #define ARBRE_H
    #include <QtGui>
     
    class Arbre :  public QWidget
    {
    Q_OBJECT
     
    public:
    Arbre();
     
    private slots:
     
    void dessin ();
    private:
       QTableWidget* tableWidget;
       QPushButton * Tracer;
       QPainter *painter;
       int M [2][2];
    //void paintEvent(QPaintEvent *);
    };
     
     
     
    #endif // ARBRE_H
     
    //arbre.cpp
    #include "arbre.h"
    #include "math.h"
    #include <QtGui>
    Arbre::Arbre()
    {
        tableWidget = new QTableWidget(2,2,this);
           Tracer = new QPushButton("Tracer",this);
           Tracer->move(10,10);
     
           connect(Tracer, SIGNAL(clicked()), this, SLOT(dessin()));
    }
     
     
    /*void Arbre::paintEvent(QPaintEvent *e)
    {
       tableWidget = new QTableWidget(2,2,this);
       Tracer = new QPushButton("Tracer",this);
       Tracer->move(10,10);
     
       connect(Tracer, SIGNAL(clicked()), this, SLOT(dessin()));
    }*/
    /////////////////////////////////////////////////////////////////
     
     
     
    void Arbre::dessin()
    {
        int Nb_Sommet=2;
     
        int s;
        int k;
        QString str;
        for (s=0; s<Nb_Sommet; s++)
        {
          for (k=0; k<Nb_Sommet; k++)
          {
           M[s][k] = 0;
     
          }
        }
    str = ((tableWidget->itemAt(1,0))->text());
        int dec = str.toInt();
        (M[0][1])=dec;
     QPainter painter(this);
     
     bool tour=false;
     int x=35;
     int y=45;
    int Num_Sommet=0;
     
    int T_Coordonnees [Nb_Sommet][Nb_Sommet];
    while (Num_Sommet<Nb_Sommet)
    {
     
         painter.drawEllipse(x,y,30,30);
         (T_Coordonnees[Num_Sommet][0])=x;
          (T_Coordonnees[Num_Sommet][1])=y;
     
     
        if (tour==false)
        {
            x+=85;
            tour=true;
        }
        else
        {
           y+=95;
           tour=false;
        }
    Num_Sommet++;
    }
    Num_Sommet--;
    int i,j;
    for (i=0; i<Nb_Sommet; i++){
        for (j=0; j<Nb_Sommet; j++){
            if(  (M[i][j] == 1)&&(M[j][i]==1) )
            {
     
     
                painter.drawLine((T_Coordonnees[i][0]+20),(T_Coordonnees[i][1]),(T_Coordonnees[j][0]+20),(T_Coordonnees[j][1]));
                if(  (T_Coordonnees[i][1]>45)||(T_Coordonnees[j][1]>45)  )
                {
                   painter.drawLine(((T_Coordonnees[i][0]+20)-10),(T_Coordonnees[i][1]),((T_Coordonnees[j][0]+20)-10),(T_Coordonnees[j][1]));
                }
                else
                {
                painter.drawLine((T_Coordonnees[i][0]+20),(T_Coordonnees[i][1]+30),(T_Coordonnees[j][0]+20),(T_Coordonnees[j][1]+30));
                }
            }
            else
            {
                if (M[i][j]==1)
                {
                   painter.drawLine((T_Coordonnees[i][0]+20),(T_Coordonnees[i][1]),(T_Coordonnees[j][0]+20),(T_Coordonnees[j][1]));
                }
     
            }
     
        }
    }
     
     
     
    }
     
     
    //main.cpp
     
    #include <QApplication>
    #include "arbre.h"
     
    int main(int argc, char* argv[])
    {
    QApplication app(argc, argv);
     
    Arbre fenetre;
    fenetre.show();
     
    return app.exec();
    }
    Merci encore une fois.

  15. #15
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Citation Envoyé par Amnell Voir le message
    Le souci est que s'il ne souhaite pas dessiner "avant" que l'on ait cliqué sur son bouton, le paintEvent() tel que tu l'as donné risque de poser problème.
    Exact, je me suis pas trop penché sur sa mécanique avec le bouton. Je ne sais pas si c'est une bonne approche mais par exemple on pourrait gérer un booléen membre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Arbre::paintEvent(QPaintEvent *e)
    {
        if ( m_bDessinRequis ) {
            dessin();
            m_bDessinRequis = false;
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(Tracer, SIGNAL(clicked()), SLOT(dessiner()));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Arbre::dessiner()
    {
        m_bDessinRequis = true;
        update();
    }
    C'est un début...

  16. #16
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Par code propre et bien indenté, j'entendais plutôt ceci (ce qui est bien plus lisible) :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    void Arbre::dessin()
    {
        QPainter painter(this);
     
        bool tour = false;
        int x = 35;
        int y = 45;
        int Nb_Sommet = 2;
     
        for (int i = 0; i < Nb_Sommet; ++i)
            for (int j = 0; j < Nb_Sommet; ++j)
                M[i][j] = 0;
     
        QString str = ((tableWidget->itemAt(1, 0))->text());
        int dec = str.toInt();
        M[0][1] = dec;
     
        int T_Coordonnees[Nb_Sommet][Nb_Sommet];
        for (int Num_Sommet = 0; Num_Sommet < Nb_Sommet; ++Num_Sommet)
        {
            painter.drawEllipse(x, y, 30, 30);
            T_Coordonnees[Num_Sommet][0] = x;
            T_Coordonnees[Num_Sommet][1] = y;
            if (!tour)
                x += 85;
            else
                y += 95;
            tour = !tour;
        }
     
        for (int i = 0; i < Nb_Sommet; ++i)
        {
            for (int j = 0; j < Nb_Sommet; ++j)
            {
                if (M[i][j] == 1 && M[j][i] == 1)
                {
                    painter.drawLine(T_Coordonnees[i][0] + 20, T_Coordonnees[i][1],
                        T_Coordonnees[j][0] + 20, T_Coordonnees[j][1]);
     
                    if (T_Coordonnees[i][1] > 45 || T_Coordonnees[j][1] > 45)
                    {
                        painter.drawLine(T_Coordonnees[i][0] + 10, T_Coordonnees[i][1],
                            T_Coordonnees[j][0] + 10, T_Coordonnees[j][1]);
                    }
                    else
                    {
                        painter.drawLine(T_Coordonnees[i][0] + 20, T_Coordonnees[i][1] + 30,
                            T_Coordonnees[j][0] + 20, T_Coordonnees[j][1] + 30);
                    }
                }
                else if (M[i][j] == 1)
                {
                    painter.drawLine(T_Coordonnees[i][0] + 20, T_Coordonnees[i][1],
                        T_Coordonnees[j][0] + 20, T_Coordonnees[j][1]);
                }
            }
        }
    }
    Plusieurs remarques suite à cette réindentation et à la refactorisation de certains éléments :

    • Connaissez-vous la différence entre var++ et ++var ?
    • Nous sommes en C++, non en C, ce qui autorise la syntaxe for (int i = 0; ...) ;
    • Dans votre code, vous aviez un Num_Sommet--. Etant donné que cette variable ne sert pas, c'est inutile.

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

Discussions similaires

  1. Tableau en paramètre d'une fonction d'une dll C++
    Par declencher dans le forum Débuter
    Réponses: 18
    Dernier message: 05/08/2011, 23h27
  2. Réponses: 0
    Dernier message: 23/12/2009, 12h38
  3. Réponses: 2
    Dernier message: 22/12/2009, 15h01
  4. Section d'un tableau en paramètre d'une fonction
    Par ZeLL dans le forum Fortran
    Réponses: 5
    Dernier message: 18/04/2007, 14h49
  5. Réponses: 6
    Dernier message: 24/07/2006, 15h22

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