PDA

View Full Version : An array as a common variable between two classes .



hichemnho
21st February 2012, 21:50
Hello,

I would like to use an boolean array "M".
Here is what I want to do:
-I fill the QTableWidget .
-After a click on the QPushButton "generer" the boolean array M receives the values that I fiiled in the QTableWidget.
-after a click on the QPushButton "dessiner" a second window is created "FenDessin" which contains a Draw related to the values of the boolean array M.
Here is the code:


///////////the Headers//////////////////////
//FenPrinicipale.h
#ifndef FENPRINCIPALE_H
#define FENPRINCIPALE_H
#include <QtGui>

class FenPrincipale : public QWidget
{
Q_OBJECT
public:
FenPrincipale();
bool M[10][10];
private slots:
void FillIn();
void FenetreDessin();
private:
QTableWidget *tabM;
QPushButton * generer;
QPushButton * dessiner;
QVBoxLayout * vbox;
};
#endif // FENPRINCIPALE_H


//FenDessin.h
#ifndef FENDESSIN_H
#define FENDESSIN_H
#include <QtGui>
class FenDessin : public QDialog
{
public:
FenDessin ( QWidget *parent);

private:
QPushButton *fermer;
QPainter *painter;
private slots:
void paintEvent (QPaintEvent *);
};
#endif // FENDESSIN_H



//FenPrincipale.cpp
#include "qDebug.h"
#include "FenPrincipale.h"
#include "FenDessin.h"
FenPrincipale::FenPrincipale()
{
tabM =new QTableWidget(this);
tabM->setRowCount(10);
tabM->setColumnCount(10);
generer = new QPushButton("&Générer !",this);
QVBoxLayout* vbox = new QVBoxLayout();
vbox->addWidget(generer);
vbox->addWidget(dessiner);
vbox->addWidget(tabM);
this->setLayout(vbox);
for (int r = 0; r < 10; r++) {
for (int c = 0; c < 10; c++) {
QTableWidgetItem *it = new QTableWidgetItem;
tabM->setItem(r, c, it);
it->setData(Qt::EditRole, 0);

}
}
connect(generer, SIGNAL(clicked()), this, SLOT(FillIn()));
}
void FenPrincipale::FillIn()
{
for (int r = 0; r < 10; r++) {
for (int c = 0; c < 10; c++) {
QTableWidgetItem *it = tabM->item(r,c);;
Q_ASSERT(it);
qDebug() <<it;
int val = (it->data(Qt::EditRole)).toInt();
M[r][c] = (val == 1)? true: false;
qDebug() <<M[r][c];
}
}
connect(dessiner, SIGNAL(clicked()), this, SLOT(FenetreDessin()));
}
void FenPrincipale::FenetreDessin()
{
FenDessin *fenetreCC = new FenDessin( this);
fenetreCC->exec();
}


//FenDessin.cpp
#include "FenDessin.h"
FenDessin::FenDessin( QWidget *parent = 0) :QDialog(parent)
{
fermer = new QPushButton("Fermer",this);
QPaintEvent *c;
paintEvent(c);
connect(fermer, SIGNAL(clicked()), this, SLOT(accept()));

}
void FenDessin::paintEvent(QPaintEvent *c)
{
QPainter painter(this);
int o,p;
for (o=0; o<10; o++)
{
for (p=0; p<10; p++)
{
M[o][p]=0;
}
}
int tour=0;
int x=10;
int y=10;
int Num_Sommet=0;
int T_Coordonnees [10][3];
for (Num_Sommet=0; Num_Sommet<10; Num_Sommet++)
{
(T_Coordonnees[Num_Sommet][0])=x;
(T_Coordonnees[Num_Sommet][1])=y;
(T_Coordonnees[Num_Sommet][2])=tour;

if (tour==0)
{
x+=35;
tour=1;
}
else
{
y+=55;
tour=0;
}

}

int w1=0;
int w2=0;
int cpt=10;
Num_Sommet=0;
for (Num_Sommet=0; Num_Sommet<10; Num_Sommet++)
{
if ( (T_Coordonnees[Num_Sommet][2])==1)
{ if(w1==0)
{
(T_Coordonnees[Num_Sommet][0])=((T_Coordonnees[Num_Sommet][0])+500) ;
w1=1;
}
else
{
if(w1==1)
{
(T_Coordonnees[Num_Sommet][0])=((T_Coordonnees[Num_Sommet][0])+250+cpt) ;
w1=0;
cpt=cpt+15;
}
}
if (Num_Sommet==9)
{
(T_Coordonnees[Num_Sommet][0])=((T_Coordonnees[Num_Sommet][0])+45) ;
}

}
else
{
if(w2==0)
{
(T_Coordonnees[Num_Sommet][0])=(T_Coordonnees[Num_Sommet][0])+200;
w2=1;
}
else
{
(T_Coordonnees[Num_Sommet][0])=(T_Coordonnees[Num_Sommet][0])+100+cpt;
w2=0;
cpt=cpt+15;
}

if (Num_Sommet==4)
{
(T_Coordonnees[Num_Sommet][0])=((T_Coordonnees[Num_Sommet][0])+45) ;
}
}
painter.drawEllipse((T_Coordonnees[Num_Sommet][0]), (T_Coordonnees[Num_Sommet][1]), 30.0, 30.0);
}

int i,j;
for (i=0; i<10; i++)
{
for (j=0; j<10; j++)
{
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]));
}
}
}



for (i=0; i<10; i++)
{
for (j=0; j<10; 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));
}
}
}
}
////////////////////////////////////////////////
Num_Sommet=0;
for (Num_Sommet=0; Num_Sommet<10; 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 "FenPrincipale.h"
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
FenPrincipale fenetre;
fenetre.show();
return app.exec();
}


I would like to declare the array M as a global variable so that the class FenDessin can use it to make the drawing without the error:
" M is not declared in this scope"
Thank you for the attention given to this message.

ChrisW67
21st February 2012, 22:00
If you want access to the data in the public FenPrincipale::M member variable in another class then you need one of these:

Pass a pointer (or reference as appropriate) to the FenPrincipale instance to the other class and access M through that
Supply the other class with a pointer (or reference) to the FenPrincipale::M member directly
Supply the other class with a copy of the FenPrincipale::M member

which you choose is up to you and your requirements.

This is 100% C++ knowledge, and nothing to do with Qt.

hichemnho
25th February 2012, 17:00
Thank you for your response,
As the title of the forum is saying I am a newbie, so can't you be more specific and give me a code of what you are suggesting?
Thanks in advance!!!

Added after 39 minutes:

Hello,
I've modified the code only the "FenDessin.h" and "FenDessin.cpp" but the program crashed.


//FenDessin.h
#ifndef FENDESSIN_H
#define FENDESSIN_H
#include <QtGui>
#include"FenPrincipale.h"
class FenDessin : public QDialog
{
public:
FenDessin ( FenPrincipale* parent);


private:
QPushButton *fermer;
QPainter *painter;
FenPrincipale * ref;
private slots:
void paintEvent (QPaintEvent *);
};
#endif // FENDESSIN_H



//FenDessin.cpp
#include "FenDessin.h"

FenDessin::FenDessin( FenPrincipale *parent) :QDialog(parent),ref(parent)
{
fermer = new QPushButton("Fermer",this);
QPaintEvent *c;
paintEvent(c);
connect(fermer, SIGNAL(clicked()), this, SLOT(accept()));

}
void FenDessin::paintEvent(QPaintEvent *c)
{
QPainter painter(this);


int tour=0;
int x=10;
int y=10;
int Num_Sommet=0;
int T_Coordonnees [10][3];
for (Num_Sommet=0; Num_Sommet<10; Num_Sommet++)
{
(T_Coordonnees[Num_Sommet][0])=x;
(T_Coordonnees[Num_Sommet][1])=y;
(T_Coordonnees[Num_Sommet][2])=tour;

if (tour==0)
{
x+=35;
tour=1;
}
else
{
y+=55;
tour=0;
}

}

int w1=0;
int w2=0;
int cpt=10;
Num_Sommet=0;
for (Num_Sommet=0; Num_Sommet<10; Num_Sommet++)
{
if ( (T_Coordonnees[Num_Sommet][2])==1)
{ if(w1==0)
{
(T_Coordonnees[Num_Sommet][0])=((T_Coordonnees[Num_Sommet][0])+500) ;
w1=1;
}
else
{
if(w1==1)
{
(T_Coordonnees[Num_Sommet][0])=((T_Coordonnees[Num_Sommet][0])+250+cpt) ;
w1=0;
cpt=cpt+15;
}
}
if (Num_Sommet==9)
{
(T_Coordonnees[Num_Sommet][0])=((T_Coordonnees[Num_Sommet][0])+45) ;
}

}
else
{
if(w2==0)
{
(T_Coordonnees[Num_Sommet][0])=(T_Coordonnees[Num_Sommet][0])+200;
w2=1;
}
else
{
(T_Coordonnees[Num_Sommet][0])=(T_Coordonnees[Num_Sommet][0])+100+cpt;
w2=0;
cpt=cpt+15;
}

if (Num_Sommet==4)
{
(T_Coordonnees[Num_Sommet][0])=((T_Coordonnees[Num_Sommet][0])+45) ;
}
}
painter.drawEllipse((T_Coordonnees[Num_Sommet][0]), (T_Coordonnees[Num_Sommet][1]), 30.0, 30.0);
}

int i,j;
for (i=0; i<10; i++)
{
for (j=0; j<10; j++)
{
if ((ref->M[i][j])==1)
{
painter.drawLine((T_Coordonnees[i][0]+20),(T_Coordonnees[i][1]),(T_Coordonnees[j][0]+20),(T_Coordonnees[j][1]));
}
}
}



for (i=0; i<10; i++)
{
for (j=0; j<10; j++)
{
if ((ref->M[i][j]==1) && (ref->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));
}
}
}
}
////////////////////////////////////////////////
Num_Sommet=0;
for (Num_Sommet=0; Num_Sommet<10; 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);

}
}



Thanks for the attention given to this message.

Added after 43 minutes:

Hello,
Finally the code works.
I 've modified the FenDessin.cpp and FenDessin.h


//FenDessin.h
#ifndef FENDESSIN_H
#define FENDESSIN_H
#include <QtGui>
#include"FenPrincipale.h"
class FenDessin : public QDialog
{
public:
FenDessin ( FenPrincipale* parent);


private:
QPushButton *fermer;
QPainter *painter;
FenPrincipale * ref;
private slots:
void paintEvent (QPaintEvent *);
};
#endif // FENDESSIN_H


//FenDessin.cpp
#include "FenDessin.h"

FenDessin::FenDessin( FenPrincipale *parent) :QDialog(parent),ref(parent)
{
fermer = new QPushButton("Fermer",this);
QPaintEvent *c;
paintEvent(c);
connect(fermer, SIGNAL(clicked()), this, SLOT(accept()));

}
void FenDessin::paintEvent(QPaintEvent *c)
{
QPainter painter(this);


int tour=0;
int x=10;
int y=10;
int Num_Sommet=0;
int T_Coordonnees [10][3];
for (Num_Sommet=0; Num_Sommet<10; Num_Sommet++)
{
(T_Coordonnees[Num_Sommet][0])=x;
(T_Coordonnees[Num_Sommet][1])=y;
(T_Coordonnees[Num_Sommet][2])=tour;

if (tour==0)
{
x+=35;
tour=1;
}
else
{
y+=55;
tour=0;
}

}

int w1=0;
int w2=0;
int cpt=10;
Num_Sommet=0;
for (Num_Sommet=0; Num_Sommet<10; Num_Sommet++)
{
if ( (T_Coordonnees[Num_Sommet][2])==1)
{ if(w1==0)
{
(T_Coordonnees[Num_Sommet][0])=((T_Coordonnees[Num_Sommet][0])+500) ;
w1=1;
}
else
{
if(w1==1)
{
(T_Coordonnees[Num_Sommet][0])=((T_Coordonnees[Num_Sommet][0])+250+cpt) ;
w1=0;
cpt=cpt+15;
}
}
if (Num_Sommet==9)
{
(T_Coordonnees[Num_Sommet][0])=((T_Coordonnees[Num_Sommet][0])+45) ;
}

}
else
{
if(w2==0)
{
(T_Coordonnees[Num_Sommet][0])=(T_Coordonnees[Num_Sommet][0])+200;
w2=1;
}
else
{
(T_Coordonnees[Num_Sommet][0])=(T_Coordonnees[Num_Sommet][0])+100+cpt;
w2=0;
cpt=cpt+15;
}

if (Num_Sommet==4)
{
(T_Coordonnees[Num_Sommet][0])=((T_Coordonnees[Num_Sommet][0])+45) ;
}
}
painter.drawEllipse((T_Coordonnees[Num_Sommet][0]), (T_Coordonnees[Num_Sommet][1]), 30.0, 30.0);
}

int i,j;
for (i=0; i<10; i++)
{
for (j=0; j<10; j++)
{
if ((ref->M[i][j])==1)
{
painter.drawLine((T_Coordonnees[i][0]+20),(T_Coordonnees[i][1]),(T_Coordonnees[j][0]+20),(T_Coordonnees[j][1]));
}
}
}



for (i=0; i<10; i++)
{
for (j=0; j<10; j++)
{
if ((ref->M[i][j]==1) && (ref->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));
}
}
}
}
////////////////////////////////////////////////
Num_Sommet=0;
for (Num_Sommet=0; Num_Sommet<10; 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);

}
}


Thank you very much.

ChrisW67
25th February 2012, 22:25
As the title of the forum is saying I am a newbie, so can't you be more specific and give me a code of what you are suggesting?[/code]

More examples:
[quote=me]Pass a pointer (or reference as appropriate) to the FenPrincipale instance to the other class and access M through that


class A {
public:
A() { memberVar = 1; }
int memberVar;
};

class B {
public:
B(): myData(7) { }

void doStuff(A *a) {
qDebug() << myData * a->memberVar;
}

void doStuff(const A &a) {
qDebug() << myData * a.memberVar;
}

private:
int myData;
};



Supply the other class with a pointer (or reference) to the FenPrincipale::M member directly


class A {
public:
A() { memberVar = 1; }
int memberVar;
};

class B {
public:
B(): myData(7) { }

void doStuff(int *aMemberVar) {
qDebug() << myData + *aMemberVar;
}

void doStuff(int &aMemberVar) {
qDebug() << myData + aMemberVar;
}

private:
int myData;
};


Supply the other class with a copy of the FenPrincipale::M member


class A {
public:
A() { memberVar = 1; }
int memberVar;
};

class B {
public:
B(): myData(7) { }

void doStuff(int aMemberVarCopy) {
qDebug() << myData - aMemberVarCopy;
}

private:
int myData;
};