Probleme variables Qt C++

Fermé
fredrizk - 6 juil. 2011 à 09:55
fredrizk Messages postés 12 Date d'inscription mercredi 6 juillet 2011 Statut Membre Dernière intervention 1 août 2011 - 6 juil. 2011 à 11:39
Bonjour,
Je developpe un logiciel sous windows 7 (32bit), avec Qt, 4.7.3 en C++.
j'ai redigé la quasi totalisée du code source mais je suis face à un problème : mes variable garde leur valeur d'initialisation et j'arrive pas à leur affectée de nouvelles valeurs.

je met une partie du code en esérant avoir une réponse.
Merci d'avance.

fichier.h
#ifndef CALDEBIT_H
#define CALDEBIT_H

#include <QWidget>

class QDoubleSpinBox;
class QGroupBox;
class QLabel;
class QPushButton;
class QAction;
class QMessageBox ;
class QString ;
class QPixmap;

class Window : public QWidget
{
Q_OBJECT

public:

Window();

double Ivalcote;
double Ivalcote1;
double Ivaldebit;
double valcote;
double valcote1;
double valdebit;

void Init()
{
Ivalcote = 0;
Ivalcote1 =0;
Ivaldebit=0;
}

public slots:

void Resultats();
double calculs();
void OnClick();

private:
double CoteDebit();
void Boutons();
void quit();
void setText();

QDoubleSpinBox *doubleSpinBox;
QGroupBox *spinBoxesGroup;
QGroupBox *editsGroup;
QGroupBox *doubleSpinBoxesGroup;
QLabel *label;
QLabel *datetimeedit;
QPushButton *boutonok;
QPushButton *boutonQuitter;
QAction *exitAction;
QString *res;
QString *res1;
QString *Qs;
};

#endif // CALDEBIT_H

fichier.cpp

#include <QtGui>
#include <QVBoxLayout>
#include <QFormLayout>
#include <QTime>

#include "caldebit.h"

/*======================================================================================================================
DECLARATION DE LA FENETRE PRINCIPAL DU LOGICIEL
======================================================================================================================*/
Window::Window()
{
Init();

CoteDebit();
Boutons();

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(spinBoxesGroup);
layout->addWidget(editsGroup);
layout->addWidget(doubleSpinBoxesGroup);
setLayout(layout);

setWindowTitle(tr("Calculateur du Barrahe de Villerest"));
}

/*======================================================================================================================
FONCTION PERMETTANT DE RECUPERER LES VALEURS DES COTES ET DU DEBIT ET DE LES STOCKER
======================================================================================================================*/
double Window::CoteDebit()
{

spinBoxesGroup = new QGroupBox(tr("Cotes et Débit : "));

QLabel *retenue = new QLabel(tr("Entrer la cote de la retenue précedente : "));

QDoubleSpinBox *SpinBox = new QDoubleSpinBox;
SpinBox->setRange(270, 325);
SpinBox->setSingleStep(0.01);
SpinBox->setValue(0);
valcote = SpinBox->value();

QLabel *retenueactuelle = new QLabel(tr("Entrer la cote de la retenue actuelle : "));

QDoubleSpinBox *retactu = new QDoubleSpinBox;
retactu->setRange(270, 325);
retactu->setSingleStep(0.01);
retactu->setValue(0);
valcote1 = retactu->value();

QLabel *debitsortant = new QLabel(tr("Entrer la valeur du débit sortant actuel : "));

QDoubleSpinBox *debsor = new QDoubleSpinBox;
debsor->setRange(0, 4000);
debsor->setSingleStep(0.01);
debsor->setValue(0);
valdebit = debsor->value();

QGridLayout *spinBoxLayout = new QGridLayout;
spinBoxLayout->addWidget(retenue,0,0);
spinBoxLayout->addWidget(SpinBox,1,0);
spinBoxLayout->addWidget(retenueactuelle,3,0);
spinBoxLayout->addWidget(retactu,4,0);
spinBoxLayout->addWidget(debitsortant,6,0);
spinBoxLayout->addWidget(debsor,7,0);

spinBoxesGroup->setLayout(spinBoxLayout);

Ivalcote=valcote;
Ivalcote1=valcote1;
Ivaldebit=valdebit;

return Ivalcote;
return Ivalcote1;
return Ivaldebit;
}

/*======================================================================================================================
LES RESULTATS
======================================================================================================================*/
void Window::Resultats()
{
QString res ;
res.setNum (Ivalcote);
QString res1;
res1.setNum (Ivalcote1);
QString Qs ;
Qs.setNum(Ivaldebit);

qDebug() << "la première cote de la retenue est au niveau"<<Ivalcote<<"NGF.";
qDebug() << "la deuxième cote de la retenue est au niveau"<<Ivalcote1<<"NGF.";
qDebug() << "le débit sortant est de"<<Ivaldebit<<"M3/s.";

QMessageBox::information(this, "Resultats", "\n A la cote " + res.setNum (Ivalcote) + " NGF le volume de la retenue est de " " \n\n"
"A la cote " + res.setNum (Ivalcote1) + " NGF le volume de la retenue est de " " \n\n"
"le debit sortant est de : " + Qs.setNum(Ivaldebit)+ " M3/s \n\n"

}


A voir également:

4 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
6 juil. 2011 à 10:33
Hum... Je pense que tu n'as pas bien compris comment fonctionne Qt ou le C++.
il faut que tu fasses une fonction qui mette à jour tes variables, puis faire une connection entre le signal de changement de valeur (des psinbox) et la fonction modifiant les valeurs de la classe.
0
fredrizk Messages postés 12 Date d'inscription mercredi 6 juillet 2011 Statut Membre Dernière intervention 1 août 2011
6 juil. 2011 à 10:41
Bonjour Char Snipeur
Serait-il possible de me faire un petit exemple car je dois avouer que je suis complètement perdu.
Je te remercie d'avance
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
Modifié par Char Snipeur le 6/07/2011 à 11:34
double Window::CoteDebit() 
{ 

spinBoxesGroup = new QGroupBox(tr("Cotes et Débit : ")); 

QLabel *retenue = new QLabel(tr("Entrer la cote de la retenue précedente : ")); 

QDoubleSpinBox *SpinBox = new QDoubleSpinBox; 
SpinBox->setRange(270, 325); 
SpinBox->setSingleStep(0.01); 
SpinBox->setValue(0); 
valcote = SpinBox->value(); 

QLabel *retenueactuelle = new QLabel(tr("Entrer la cote de la retenue actuelle : ")); 

QDoubleSpinBox *retactu = new QDoubleSpinBox; 
retactu->setRange(270, 325); 
retactu->setSingleStep(0.01); 
retactu->setValue(0); 
valcote1 = retactu->value(); 

QLabel *debitsortant = new QLabel(tr("Entrer la valeur du débit sortant actuel : ")); 

QDoubleSpinBox *debsor = new QDoubleSpinBox; 
debsor->setRange(0, 4000); 
debsor->setSingleStep(0.01); 
debsor->setValue(0); 
valdebit = debsor->value(); 

QGridLayout *spinBoxLayout = new QGridLayout; 
spinBoxLayout->addWidget(retenue,0,0); 
spinBoxLayout->addWidget(SpinBox,1,0); 
spinBoxLayout->addWidget(retenueactuelle,3,0); 
spinBoxLayout->addWidget(retactu,4,0); 
spinBoxLayout->addWidget(debitsortant,6,0); 
spinBoxLayout->addWidget(debsor,7,0); 

spinBoxesGroup->setLayout(spinBoxLayout); 

connect(SpinBox,SIGNAL(changed(double)),this,SLOT(maj()) ); 
connect(retactu,SIGNAL(changed(double)),this,SLOT(maj()) ); 
... 
return 0; 
}  
////////////////////////// fonction à mettre dans les SLOT. 
void Window::maj() 
{ 

valcote = SpinBox->value(); 
valcote1 = retactu->value(); 
valdebit = debsor->value(); 

Ivalcote=valcote; 
Ivalcote1=valcote1; 
Ivaldebit=valdebit; 
} 

voilà ce que ça donne par exemple. Seulement, ça ne fonctionnera pas car tu utilise des variables temporaire pour te objet de type spinbox.
Une solution est de faire des fonction maj_SpinBox(double) en récupérant la valeur émisse par le signal.
connect(SpinBox,SIGNAL(changed(double)),this,SLOT(maj_SpinBox(double)) ); 
... 
void maj_SpinBox(double a) 
{ 
     valcote=a; 
} 

La vrai soumission c'est quand les esclaves s'inquiètent du cours du coton.
Char Snipeur
0
fredrizk Messages postés 12 Date d'inscription mercredi 6 juillet 2011 Statut Membre Dernière intervention 1 août 2011
6 juil. 2011 à 11:39
Je te remercie pour ton aide. je vais essayer d'appliquer ton code en espérant que ça marche :).
0