Je ne suis pas un expert de Qt, mais j'essaie de créer un programme (très simple) visant à récolter des informations entrées par l'utilisateur dans un QLineEdit, pour ensuite lui souhaiter la bienvenue dans une boite de dialogue.
Le code s’exécute sans problème, cependant la boite de dialogue n'affiche ni le prénom ni le nom entrés par l'utilisateur, et je ne comprends pas bien pourquoi. Elle affiche juste "Bienvenue, !".
Je mets QString(*m_message) comme argument de ma fonction QMessageBox::information, cela ne devrait donc pas poser de problème, si ?
En tous cas, j'ai essayé en remplaçant le pointeur par une variable QString normale comme tu me l'as dit, et ça n'affiche toujours pas le bon message...
Il n'y a effectivement pas besoin d'utiliser des pointeurs pour QString. De manière générale, il n'y a pas besoin de pointeur pour les conteneurs de Qt. Tu n'as pas non plus besoin de remettre QString(...), l'expression est déjà QString, c'est une information redondante.
Et sinon, à quoi te sert m_message ? Quelle valeur contient la variable avant d'afficher la boîte de dialogue ? Quand change la valeur ?
Je sais que le fait de remarquer QString(...) crée une redondance, mais en voyant que ça ne marchait pas sans, j'ai commencé à modifier mon code de façon subtile pour voir si des changements comme celui là pouvait faire fonctionner le programme...
En fait, j'ai créer une variable m_message juste pour voir si cela marcherait mieux. A le base, j'ai écrit :
Et cela ne m'affichait ni le nom ni le prénom, donc je me suis dit "essayons d'entrer une seule variable comme troisième argument de QMessageBox::information et voir si ça marche". Mais non.
Et je déclare juste m_message juste dans mon .h. Ensuite je lui affecte la valeur :
On va faire simple : à part QWidget, qui représente l'élément de base de ta classe et QString qui est utilisé sous forme de valeur, tous...
En effet, lorsque tu déclares des pointeurs vers des éléments, le compilateur peut se contenter de savoir que les éléments en question existent dans le fichier d'en-tête, et une déclaration anticipée suffit.
Il faut, par contre, inclure le fichier d'en-tête qui définit l'élément pointé dans le fichier d'implémentation (*.cpp)
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
Si j'enlève les #include, le programme ne marchera plus. Je ne comprends pas bien ce que tu me propose de faire à la place... De mettre mes #include dans le .cpp ?
un fichier doit inclure ce dont lui même à besoin rien de plus. A chacun d'inclure ce qui lui manque, et ne jamais trop en vouloir. Surtout dans les fichiers d'entête, trop d'inclusion peuvent amener des problèmes complexes de cycles d'inclusion.
Il faut comprendre que la seule chose dont on soit sur à propos d'un fichier d'en-tête, c'est qu'il a de très fortes chances de se retrouver inclus dans un un autre fichier.
Le problème, c'est que le mécanisme d'inclusion consiste, "tout simplement", à remplacer la commande #inclulde <fichier> par le contenu du fichier en question, et ce, de manière récursive : si A inclut B, que B inclut C et que C inclus D, le préprocesseur va copier le contenu de B dans A, puis il va croiser (dans le contenu de B) l'inclusion de C, dont il va donc copier le contenu à l'endroit où se trouve l'instruction, et qu'il va enfin croiser l'inclusion de D (dans ce qui est le contenu de C), et qu'il va donc copier le contenu de D dans A
La seule inclusion du fichier d'en-tête <iostream>, par exemple -- pour profiter de std::cin et de std::cout-- va ajouter plus de 28 000 lignes de code dans ton fichier.
Mais ce sont donc plus de 28 000 lignes de code que le compilateur devra traiter pour générer le code binaire exécutable. Et la compilation est un processus dont le temps pour l'exécuter augmente de manière significative par rapport au nombre d'instructions : il mettra sans doute deux fois plus longtemps à compiler 28 000 lignes de code qu'à en compiler... 14 000 .
Plus tu rajouteras d'inclusions dans un de tes fichiers d'en-tête, plus tu augmenteras donc -- d'office -- le temps nécessaire à la compilation de tous les fichiers d'implémentations qui ont besoin de ton fichier d'en-tête.
C'est la raison pour laquelle on essaye de limiter les inclusions au stricte minimum dans le fichier d'en-tête, en laissant le soin à celui qui écrit le fichier d'implémentation d'ajouter les en-tête dont il a réellement besoin.
Ainsi, pour reprendre ton exemple d'origine, en le corrigeant un tout petit peu, on va préférer travailler sous une forme proche de
#ifndef FENETRE_H
#define FENETRE_H
/* j'ai besoin de QWidget, qui est la classe de base de MaFenetre
*/
#include <QWidget>
/* j'ai besoin de QString, à cause de la donnée membre m_message
*/
#include <QString>
/* Je dois faire comprendre au compilateur que la classe
* QushButton existe. C'est tout ce dont il a besoin pour
* l'instant
*/
class QPushButton;
class MaFenetre : public QWidget
{
Q_OBJECT
public :
MaFenetre();
public slots :
void boiteDialogue();
private :
QPushButton *m_boutonOk;
QPushButton *m_boutonQuitter;
QString m_message;
};
#endif // FENETRE_H
Ensuite, dans le fichier d'implémentation, je pourrai inclure les fichiers d'en-tête dont j'ai vraiment besoin, par exemple
#include "fenetre.h"
/* je les mets dans l'ordre dans lequel j'en aurai besoin ...
* je commence par les données membre de la classe (les
* QPushButton), puis je rajoute ceux dont j'ai besoin
* dans l'ordre dans lequel ils apparaissent dans le
* constructeur... D'autres solutions sont possibles
* (certains aiment avoir les fichiers d'en-tête triés par
* ordre alphabétique, par exemple)
*/
#include <QPushButton>
#include <QLineEdit>
#include <QFormLayout>
#include <QVBoxLayout>
#inclde <QHBoxLayout>
MaFenetre::MaFenetre(){
QLineEdit * nom = new QLineEdit;
QLineEdit * prenom = new QLineEdit;
QLineEdit * age = new QLineEdit;
QFormLayout * layoutFormulaire = QFormLayout;
layoutFormulaire->addRow("Votre &nom :", nom);
layoutFormulaire->addRow("Votre &prénom :", prenom);
layoutFormulaire->addRow("Votre &age :", age);
m_boutonQuitter = new QPushButton("Quitter");
m_boutonOk = neq QPushButton("Ok");
QVBoxLayout * layoutPrincipal = new QVBoxLayout;
layoutPrincipal->addLayout(layoutFormulaire);
QHBoxLayout * layoutBoutons = new QHBoxLayout;
layoutBoutons->addWidget(m_boutonOk);
layoutBoutons->addWidget(m_boutonQuitter);
/* ... */
}
De cette manière, tu es sur que le fichier d'en-tête (fenetre.h) ne fourni que "le stricte nécessaire" pour pouvoir créer la fenêtre
- Edité par koala01 21 janvier 2019 à 15:50:41
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
× 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.
Ton présent détermine ton futur et la connaissance te placera au dessus de ta génération .
En recherche d'emploi.