j'en suis au chapitre "Les principaux widgets" et je souhaite avec la fenetre que j'ai créer précédemment faire que le bouton Envoyer soit Enabled si le champs nom est vide.
Voici ce que j'ai fait :
Je ne suis pas sûr d'avoir compris ta réponse. En effet si "envoyer" n'est pas dans la classe MaFenetre, j'aurais une erreur de compilation comme quoi "envoyer" n'est pas défini.
De plus, je viens d'essayer quelque chose qui ne se fait pas (mais c'etait juste pour voir le résultat) : j'ai mis QPushButton *envoyer comme public et non plus comme private. Et là tout fonctionne, sauf que c'est TOUTE la fenetre qui devient enable et non pas le bouton envoyer. C'est pas normal, si ?
Je pense avoir trouvé ton erreur : elle viendrait de ton fenetre.cpp
Dans le fenetre.h, tu as :
QPushButton *envoyer;
Et dans le fentre.cpp, on retrouve lors de la déclaration de ton bouton la ligne :
QPushButton *envoyer = new QPushButton("envoyer");
En fait, tu redéclare le bouton ! Pour le programme, le pointeur envoyer appartient à la fonction MaFenetre, c'est à dire le constructeur !
Il faut juste que tu utilises, lors de tes déclaration ceci :
envoyer = new QPushButton("Envoyer", this);
Tu crées ainsi ton bouton, qui appartient bien à ta classe et déclaré en tant que membre de la classe, et ensuite, tu peux l'utiliser à ta guise dans ta fonction
Dans mon dossier fenetre, j'ai tout supprimé sauf fenetre.cbp, fenetre.h, fenetre.cpp, main.cpp et fenetre.workspace. Dans le dossier release, il n'y a plus que les 3 dll et logo.png
voici fenetre.cpp
#include "fenetre.h"
MaFenetre::MaFenetre():QWidget()
{
setWindowTitle("Exercice avec les layouts");
setWindowIcon(QIcon("logo.png"));
QLabel *titre = new QLabel("<center><strong>Formulaire à remplir</strong></center>");
QLineEdit *nom = new QLineEdit;
QLineEdit *prenom = new QLineEdit;
QSpinBox *age = new QSpinBox;
age->setSuffix(" ans");
age->setRange(18, 80);
QFormLayout *layoutCoord = new QFormLayout;
layoutCoord->addRow(titre);
layoutCoord->addRow("Votre &nom : ", nom);
layoutCoord->addRow("Votre &prénom : ", prenom);
layoutCoord->addRow("Votre â&ge : ", age);
QPushButton *aide = new QPushButton("aide", this);
aide->setCursor(Qt::PointingHandCursor);
aide->setToolTip("ce bouton vous affiche une aide");
QPushButton *about = new QPushButton("a Propos", this);
about->setCursor(Qt::PointingHandCursor);
about->setToolTip("ce bouton vous affiche la personne ayant fait ce logiciel");
QPushButton *envoyer = new QPushButton("envoyer", this);
envoyer->setCursor(Qt::PointingHandCursor);
envoyer->setToolTip("ce bouton vous permet d'envoyer vos données");
envoyer->setEnabled(false);
QPushButton *quitter = new QPushButton("quitter", this);
quitter->setCursor(Qt::PointingHandCursor);
quitter->setToolTip("ce bouton vous permet de fermer l'application");
QGridLayout *layoutBouton = new QGridLayout;
layoutBouton->addWidget(aide, 0, 0, 1, 1);
layoutBouton->addWidget(envoyer, 0, 1, 1, 1);
layoutBouton->addWidget(quitter, 0, 2, 1, 1);
layoutBouton->addWidget(about, 1, 0, 1, 3);
QFormLayout *layoutPrinc = new QFormLayout;
layoutPrinc->addRow(layoutCoord);
layoutPrinc->addRow(layoutBouton);
setLayout(layoutPrinc);
QObject::connect(aide, SIGNAL(clicked()), this, SLOT(messageAide()));
QObject::connect(quitter, SIGNAL(clicked()), qApp, SLOT(quit()));
QObject::connect(envoyer, SIGNAL(clicked()), this, SLOT(messageEnvoyer()));
QObject::connect(about, SIGNAL(clicked()), this, SLOT(messageAbout()));
QObject::connect(nom, SIGNAL(textChanged(QString)), this, SLOT(retenirNom(QString)));
}
void MaFenetre::retenirNom(QString valeurNom)
{
if(valeurNom.length()!=0)
{
envoyer->setEnabled(true);
}
else
{
envoyer->setEnabled(false);
}
}
void MaFenetre::messageAide()
{
QMessageBox::information(this, "aide", "Il faut remplir les différents champs : <br /><strong>- nom<br />- prénom<br />- âge<br /></strong>et cliquer sur Envoyer");
}
void MaFenetre::messageEnvoyer()
{
QMessageBox::critical(this, "envoyer", "il est actuellement impossible de stocker les informations recueillies");
}
void MaFenetre::messageAbout()
{
QMessageBox::about(this, "a Propos", "Ce logiciel a été réalisé par<br /><strong>***</strong>");
}
je l'ai fait pour tous les autres QPushButton mais QLineEdit ne peut pas prendre de this, si ?
J'avoue ne pas comprendre.
Dans le .h, tu crée un pointeur vers un objet du type que tu choisis (ici ca sera un QLineEdit).
Et dans le .cpp, tu le fait pointer vers un objet de type QLineEdit que tu viens de créer. Tordu hein ?
Comme tu as fait, les objets nom et prénom sont définis 2 fois. Ce qui fait planter le compilo en théorie.
Il me paraît clair que tu n'as pas compris comment fonctionnent les champs des classes ici. Tu n'as pas l'air d'être très à l'aise dans ce que tu fais pour le moment, et en particulier tu crois que l'erreur venait du this alors que pas du tout.
Voilà ce qu'il faut faire :
Dans le .h :
QPushButton *envoyer;
Dans le constructeur du .cpp :
envoyer = new QPushButton("Envoyer");
C'est comme ça que ça marche. Toi tu fais dans le .cpp :
QPushButton *envoyer = new QPushButton("Envoyer");
Ce qui revient à redéfinir envoyer. C'est mauvais.
Excusez-moi, vous (mateo et bombadil) avez entièrement raison. C'est vrai, maintenant que j'ai réfléchi, c'était complètement stupide de faire ce que j'ai fais (heureusement vous êtes là).
Comme tu disais mateo, c'est en faisant des erreurs que l'on progresse. Et celle là je ne suis plus près de la refaire.
SLOT() et pointeur
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
If you'd like to join us, read "How do we work at OpenClassrooms"! :)