Précédent   Forum des professionnels en informatique > C et C++ > Bibliothèques > Qt
Qt Forum d'entraide technique sur la bibliothèque Qt. Avant de poster -> F.A.Q Qt
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/01/2012, 22h13   #1
Candidat au titre de Membre du Club
 
Homme
Étudiant
Inscription : avril 2011
Messages : 43
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 43
Points : 12
Points : 12
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 :
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.
hichemnho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 08h25   #2
Rédacteur
 
Avatar de Amnell
 
Homme Louis du Verdier
Étudiant
Inscription : mars 2009
Messages : 1 480
Détails du profil
Informations personnelles :
Nom : Homme Louis du Verdier
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2009
Messages : 1 480
Points : 5 159
Points : 5 159
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 :
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 :
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.
Amnell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 20h48   #3
Candidat au titre de Membre du Club
 
Homme
Étudiant
Inscription : avril 2011
Messages : 43
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 43
Points : 12
Points : 12
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.
hichemnho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 11h53   #4
Candidat au titre de Membre du Club
 
Homme
Étudiant
Inscription : avril 2011
Messages : 43
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 43
Points : 12
Points : 12
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 :
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 .
hichemnho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 11h56   #5
Modérateur
 
Homme
Ingénieur développement logiciels
Inscription : mai 2009
Messages : 574
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 23
Localisation : France

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

Informations forums :
Inscription : mai 2009
Messages : 574
Points : 916
Points : 916
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.
Troudhyl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 14h27   #6
Candidat au titre de Membre du Club
 
Homme
Étudiant
Inscription : avril 2011
Messages : 43
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 43
Points : 12
Points : 12
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 :
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.
hichemnho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 21h23   #7
Rédacteur
 
Avatar de Amnell
 
Homme Louis du Verdier
Étudiant
Inscription : mars 2009
Messages : 1 480
Détails du profil
Informations personnelles :
Nom : Homme Louis du Verdier
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2009
Messages : 1 480
Points : 5 159
Points : 5 159
Code :
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 :
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.
Amnell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 23h22   #8
Candidat au titre de Membre du Club
 
Homme
Étudiant
Inscription : avril 2011
Messages : 43
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 43
Points : 12
Points : 12
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.
hichemnho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 05h27   #9
Modérateur
 
Homme
Ingénieur développement logiciels
Inscription : mai 2009
Messages : 574
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 23
Localisation : France

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

Informations forums :
Inscription : mai 2009
Messages : 574
Points : 916
Points : 916
Tu veux dire que la documentation n'est pas claire ?
Troudhyl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 12h39   #10
Candidat au titre de Membre du Club
 
Homme
Étudiant
Inscription : avril 2011
Messages : 43
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 43
Points : 12
Points : 12
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.
hichemnho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 19h32   #11
Candidat au titre de Membre du Club
 
Homme
Étudiant
Inscription : avril 2011
Messages : 43
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 43
Points : 12
Points : 12
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 .
hichemnho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2012, 21h33   #12
Modérateur
 
Homme
Ingénieur développement logiciels
Inscription : mai 2009
Messages : 574
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 23
Localisation : France

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

Informations forums :
Inscription : mai 2009
Messages : 574
Points : 916
Points : 916
Ç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 :
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 :
connect(Tracer, SIGNAL(clicked()), this, SLOT(dessin()));
Du coup ça c'est pas bon, ce serait plutôt :
Code :
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.
Troudhyl est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2012, 13h16   #13
Rédacteur
 
Avatar de Amnell
 
Homme Louis du Verdier
Étudiant
Inscription : mars 2009
Messages : 1 480
Détails du profil
Informations personnelles :
Nom : Homme Louis du Verdier
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2009
Messages : 1 480
Points : 5 159
Points : 5 159
Citation:
Envoyé par Troudhyl Voir le message
Code :
connect(Tracer, SIGNAL(clicked()), this, SLOT(dessin()));
Du coup ça c'est pas bon, ce serait plutôt :
Code :
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.
Amnell est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2012, 22h16   #14
Candidat au titre de Membre du Club
 
Homme
Étudiant
Inscription : avril 2011
Messages : 43
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 43
Points : 12
Points : 12
Bonsoir,

Tout d'abord merci pour toute la peine que vous vous donnez pour m'aidé, ensuite voici le code:

Code :
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.
hichemnho est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2012, 23h42   #15
Modérateur
 
Homme
Ingénieur développement logiciels
Inscription : mai 2009
Messages : 574
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 23
Localisation : France

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

Informations forums :
Inscription : mai 2009
Messages : 574
Points : 916
Points : 916
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 :
1
2
3
4
5
6
7
void Arbre::paintEvent(QPaintEvent *e)
{
    if ( m_bDessinRequis ) {
        dessin();
        m_bDessinRequis = false;
    }
}
Code :
connect(Tracer, SIGNAL(clicked()), SLOT(dessiner()));
Code :
1
2
3
4
5
void Arbre::dessiner()
{
    m_bDessinRequis = true;
    update();
}
C'est un début...
Troudhyl est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/02/2012, 23h45   #16
Rédacteur
 
Avatar de Amnell
 
Homme Louis du Verdier
Étudiant
Inscription : mars 2009
Messages : 1 480
Détails du profil
Informations personnelles :
Nom : Homme Louis du Verdier
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2009
Messages : 1 480
Points : 5 159
Points : 5 159
Par code propre et bien indenté, j'entendais plutôt ceci (ce qui est bien plus lisible) :

Code :
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.
Amnell est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h34.


 
 
 
 
Partenaires

Hébergement Web