PDA

View Full Version : draw a line between two circles



hichemnho
5th February 2012, 20:29
Hello ,

I am a beginner in C++ and I am trying , but without success to draw a line between two circles .The condition that must be repsected to draw this line is that the element of the array M[i][j]==1 where i is the departure circle and j the second one.For reasons that I really do not understand other lines are drawn .
Here is the code:


// The 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 * Valider;
QPainter *painter;
int M [6][6];
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)
{
QPainter painter(this);

M[0][1]=1;
M[1][0]=1;
//M[1][2]=1;
M[0][3]=1;
// M[0][4]=1;
//M[0][5]=1;


bool tour=false;
int x=35;
int y=45;
int Num_Sommet=0;


int T_Coordonnees [6][6];
for (Num_Sommet=0; Num_Sommet<6; Num_Sommet++)
{

painter.drawEllipse(x, y, 30.0, 30.0);
(T_Coordonnees[Num_Sommet][0])=x;
(T_Coordonnees[Num_Sommet][1])=y;
if (tour==false)
{
x+=85;
tour=true;
}
else
{
y+=95;
tour=false;
}

}


int i,j;
for (i=0; i<6; i++)
{
for (j=0; j<6; j++)
{
if (M[i][j]==1)
{
painter.drawLine((T_Coordonnees[i][0]),(T_Coordonnees[i][1]),(T_Coordonnees[j][0]),(T_Coordonnees[j][1]));
}
}
}
Num_Sommet=0;
for (Num_Sommet=0; Num_Sommet<6; Num_Sommet++)
{
QPoint point = QPoint( (((T_Coordonnees[Num_Sommet][0])+15)), ((T_Coordonnees[Num_Sommet][1])+15) );
QString str;
str.setNum(Num_Sommet);
painter.drawText( point,str);

}
}




//main.cpp
#include <QApplication>
#include "arbre.h"

int main(int argc, char* argv[])
{
QApplication app(argc, argv);

Arbre fenetre;
fenetre.show();

return app.exec();
}









I thank you in advance for your time and I wish that someone could help to find out where the problem is.

marcvanriet
6th February 2012, 01:57
First, initialize all the elements of your array before you start. In debug mode, some compilers initialize everything to 0, but in release mode all uninitialized data will have an unpredictable value.

When you post some code, it is also helpfull to put some comments in it. You should add comments to your code anyway.

To find the problem, you could use qDebug. Include QDebug.h in your file, and then you can write something like this :

qDebug() << "now element " << i << j;
Print some debug info in key parts of your routine, and it will help you understand what is going on.

Best regards,
Marc

hichemnho
6th February 2012, 08:47
Thank you very much Marc ,
Like you said the problem was due to the uninitialized elements.
I really apreciate your help.

Added after 7 minutes:

Hello,

I've tried the Debug line instruction that you have put , after compilation , the result appears twice , because it is the first time that I use this , I do not understand why .
Here is where I've put it:



M[0][1]=1;
qDebug() << "now element " << M[o][p];
//M[1][0]=1;

The display is
now element 1
now element 1
Could you please tell me why .
Thank you.

ChrisW67
6th February 2012, 09:48
Calling paintEvent during the constructor makes no sense. The object does not have a visible aspect at this point. Qt will call paintEvent (which is usually a protected member BTW) when the widget needs to be drawn. This is also why debug message is appearing multiple times.