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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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
    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.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  3. #3
    Membre confirmé
    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
    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 confirmé
    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
    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 Expert

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    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 confirmé
    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
    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.

+ 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