J'ai, dans mon projet, une fenêtre principale "FenProjet" héritant de QMainWindow, une fenêtre secondaire "Fen_programmation" héritant de QDialogue qui s'ouvre lors d'un clic sur un bouton d'un toolbar et des widgets persos.
Mon problème se trouve au niveau des headers de FenProjet et de Fen_programmation.
1er problème : Dans Fen_programmation je n'utilise pas FenProjet seulement si je n'include pas "FenProjet.h" le programme compile correctement mais quitte de manière imprévue au lancement. Je ne comprends absolument pas pourquoi.
2eme problème : Etant donné le problème 1, j'inclue donc "FenProjet.h" dans Fen_programmation. Dans FenProjet j'ai besoin de créer un objet Fen_programmation, j'y include donc "Fen_programmation.h". Le problème est lorsque je déclare l'objet dans le header de FenProjet le compilateur me dit "unknown type name 'Fen_programmation' ".
J'ai lu que ce problème est du aux références croisées, je suis donc passé par des déclarations anticipées. La compilation se passe mais le programme quitte de manière imprévue au lancement.
Je veux bien un peu d'aide je suis perdu :D
Je ne vous mets pas le code pour le moment car il est un peu long et ne sachant pas d'ou vient l'erreur je ne peux pas le réduire.
tu n'as pas besoin d'inclure " FenProjet " dans " FenProgrammation " car cette dernière n'utilise pas les éléments(propriété) de FenProjet, par contre tu es obligé d'inclure FenProgammation dans FenProjet par ce que FenProjet fait appel à FenProgrammation.(désolé pour la répétition ).
Nota: est ce que dans ton FenProjet.cpp lors de l'appel de l'objet du type QDialog(petite ou seconde fenêtre) l'as-tu déclaré comme étant modal ?
puis simplifie soit crée un petit projet dont tu utilise le même principe(fenêtre N°1 appel fenêtre N°2) pour qu'on sache où t'aider
- Edité par EL-jos 13 avril 2018 à 9:45:56
Ton présent détermine ton futur et la connaissance te placera au dessus de ta génération .
Des questions comme ça : Quand tu dis "quitte au lancement" => Une erreur s'affiche? Quelque chose? Tu as utilisé un débugueur? Histoire de voir ou le programme s'arrête?
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. » D. Mendeleïev
Pas de bol, tu as justement supprimé du code les parties qui comportent très certainement ton erreur...
Pourrais tu nous donner le code complet des constructeurs de fen_projet et de fen_programmation ?
Car ma boule de crystal, qui veut bien fonctionner pour une fois, m'indique qu'il y a 90% de chances que le problème se situe à ce niveau: tu créerais des variables locales dans constructeur dont le nom serait le même que ceux des données membres de tes classes que je n'en serais pas plus étonné que cela
- Edité par koala01 13 avril 2018 à 14:38:20
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
FenProjet::FenProjet()
{
QWidget *zoneCentrale = new QWidget;
QMenu *menuFichier = menuBar()->addMenu("&Fichier");
menuFichier->addAction("Test");
QMenu *menuEdition = menuBar()->addMenu("&Edition");
menuEdition->addAction("Test");
createAction();
createTool();
//-----------Creation Widgets perso-------------//
seringue = new Seringue;
slotVoies = new Slot_voies;
//----------Création des Widgets---------------//
validator = new QDoubleValidator(0, 1000, 3, this);
validator->setLocale(QLocale::C); //Ajoute le . dans les nombres à virgule
volume = new QLineEdit;
volume->setText(QString::number(seringue->volumeMax));
QLabel *labVolume = new QLabel(tr("Volume (mL)"));
vitesseI = new QLineEdit;
vitesseI->setText(vitesseDeplacement);
QLabel *labVitesseI = new QLabel(tr("Vitesse (mm/s)"));
temperatureI = new QLineEdit;
QLabel *labTemperatureI = new QLabel(tr("Température (°C)"));
valeur_injecter = new QLineEdit;
QLabel *labInjecter = new QLabel(tr("Injecter (mL)"));
bouton51 = new QPushButton(tr("Send"));
valeur_aspirer = new QLineEdit;
QLabel *labAspirer = new QLabel(tr("Aspirer (mL)"));
bouton52 = new QPushButton(tr("Send"));
valeur_vitesseA = new QLineEdit;
QLabel *labVitesseA = new QLabel(tr("Vitesse (mm/s)"));
bouton53 = new QPushButton(tr("Send"));
valeur_temperatureA = new QLineEdit;
QLabel *labTemperatureA = new QLabel(tr("Température (°C)"));
bouton54 = new QPushButton(tr("Send"));
//-----------Connexion Fonction--------------------//
QObject::connect(bouton51, SIGNAL(clicked()), this, SLOT(injecter())); // relie le clic du bouton send injecter à la fonction injecter
QObject::connect(bouton52, SIGNAL(clicked()), this, SLOT(aspirer())); // relie le clic du bouton send aspirer à la fonction aspirer
QObject::connect(bouton53, SIGNAL(clicked()), this, SLOT(new_vitesse())); // relie le clic du bouton send vitesse à la fonction new_vitesse
QObject::connect(bouton54, SIGNAL(clicked()), this, SLOT(new_temperature())); // relie le clic du bouton send temperature à la fonction new_temperature
QObject::connect(slotVoies,SIGNAL(signalVersGeneTram(QString)),this,SLOT(generationTrameChangementVoie(QString)));
QObject::connect(seringue, SIGNAL(signalVersVolume()),this,SLOT(changementSeringue()));
QObject::connect(fen_prog, SIGNAL(emissionDepuisfen_prog()), this, SLOT(connexion()));
//------------Restriction sur les champs de saisi------------//
volume->setReadOnly(1);
vitesseI->setReadOnly(1);
temperatureI->setReadOnly(1);
valeur_injecter->setValidator(validator);
valeur_aspirer->setValidator(validator);
valeur_vitesseA->setValidator(validator);
valeur_temperatureA->setValidator(validator);
//-----------Gestion des layouts------------------//
QVBoxLayout *seringueLayoutV = new QVBoxLayout; //Création Layout Parent
QHBoxLayout *seringueLayoutH = new QHBoxLayout; //Création Layout fille 1
layoutDroite1 = new QVBoxLayout; //Création Layout fille 2 droite (Info et Action)
layoutGauche1 = new QVBoxLayout; //Création Layout fille 2 gauche (Seringue et trois voies)
layoutInformation = new QGroupBox(tr("Information")); //Création Layout fille 3 (Info)
QVBoxLayout *layoutVerticalInformation = new QVBoxLayout; //Création Layout fille 4 Info (label et Line)
layoutVerticalInformation->addWidget(labVolume);
layoutVerticalInformation->addWidget(volume);
layoutVerticalInformation->addWidget(labVitesseI);
layoutVerticalInformation->addWidget(vitesseI);
layoutVerticalInformation->addWidget(labTemperatureI);
layoutVerticalInformation->addWidget(temperatureI);
layoutInformation->setLayout(layoutVerticalInformation); //Insertion layout fille 4 -> fille 3 (Info)
layoutAction = new QGroupBox(tr("Action")); //Création Layout fille 3 (Action)
QVBoxLayout *layoutVerticalAction = new QVBoxLayout; //Création Layout fille 4 Action (Label et layout fille 4)
layoutVerticalAction->addWidget(labInjecter);
QHBoxLayout *layout4Horizontal1 = new QHBoxLayout; //Création Layout fille 5-1 (line et boutton)
layout4Horizontal1->addWidget(valeur_injecter);
layout4Horizontal1->addWidget(bouton51);
layoutVerticalAction->addLayout(layout4Horizontal1); //Insertion layout fille 5-1 -> fille 4
layoutVerticalAction->addWidget(labAspirer);
QHBoxLayout *layout4Horizontal2 = new QHBoxLayout; //Création Layout fille 5-2 (line et boutton)
layout4Horizontal2->addWidget(valeur_aspirer);
layout4Horizontal2->addWidget(bouton52);
layoutVerticalAction->addLayout(layout4Horizontal2); //Insertion layout fille 5-2 -> fille 4
layoutVerticalAction->addWidget(labVitesseA);
QHBoxLayout *layout4Horizontal3 = new QHBoxLayout; //Création Layout fille 5-3 (line et boutton)
layout4Horizontal3->addWidget(valeur_vitesseA);
layout4Horizontal3->addWidget(bouton53);
layoutVerticalAction->addLayout(layout4Horizontal3); //Insertion layout fille 5-3 -> fille 4
layoutVerticalAction->addWidget(labTemperatureA);
QHBoxLayout *layout4Horizontal4 = new QHBoxLayout; //Création Layout fille 5-4 (line et boutton)
layout4Horizontal4->addWidget(valeur_temperatureA);
layout4Horizontal4->addWidget(bouton54);
layoutVerticalAction->addLayout(layout4Horizontal4); //Insertion layout fille 5-4 -> fille 4
layoutAction->setLayout(layoutVerticalAction); //Insertion layout fille 4 -> fille 3 (Action)
layoutDroite1->addWidget(layoutInformation); //Insertion layout fille 3 (Info) -> fille 2 (Droite)
layoutDroite1->addWidget(layoutAction); //Insertion layout fille 3 (Action) -> fille 2 (Droite)
layoutGauche1->addLayout(slotVoies->slot_voiesGrpBox);
layoutGauche1->addWidget(seringue->vue_seringue); //Insertion layout animation seringue 1 -> fille 2 (Gauche)
seringueLayoutH->addLayout(layoutGauche1); //Insertion layout fille 2 (Gauche) -> fille 1
seringueLayoutH->addLayout(layoutDroite1); //Insertion layout fille 2 (Droite) -> fille 1
seringueLayoutV->addWidget(seringue->typeSeringue); //Insertion widget -> Parent
seringueLayoutV->addLayout(seringueLayoutH); //Insertion layout fille 1 -> Parent
zoneCentrale->setLayout(seringueLayoutV); //Insertion layout Parent -> ZoneCentrale
setCentralWidget(zoneCentrale);
//--------------Fin de gestion des layouts----------------//
}
- Edité par AlexandreHARISTOY 13 avril 2018 à 16:16:00
C'est beaucoup trop compliqué (d'ailleurs, j'aurais déjà du le dire plus tôt, rien qu'en voyant le nombre des données membres de fen_programmation)
Le SRP est valable aussi pour les IHM!
Si j'ai bien analysé les données membre de cette classe, tu veux avoir, dans chaque groupe, un combobox, un LineEdit et un bouton!
Hé bien, commence par créer un widget personnalisé (qui pourrait tout à fait dériver de QGroupBox) qui contient ces élément dans l'ordre qui t'intéresse, et fait en sorte qu'il puisse émettre les signaux adéquats (ou, à tout le moins, qu'il soit possible de connecter un slot particulier aux signaux qui t'intéressent dans ce groupe).
De cette manière, les données membres de fen_programmation pourraient se résoudre à quelque chose comme
et son constructeur pourrait se limiter à quelque chose comme
groupeAction1 = new MonGroupePerso;
groupeAction2 = new MonGroupePerso;
groupeAction3 = new MonGroupePerso;
groupeAction4 = new MonGroupePerso;
groupeAction5 = new MonGroupePerso;
/* connecter les slots aux signaux de ces groupes */
QVBoxLayout * layout = new QVBoxLayout;
layout->addWidget(groupeAction1);
layout->addWidget(groupeAction2);
layout->addWidget(groupeAction3);
layout->addWidget(groupeAction4);
layout->addWidget(groupeAction5);
setLayout(layout);
Et "Basta"
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 cela ne le résoud pas, cela te mettra au moins sur la voie pour y arriver
Retiens cela: les choses les plus simples sont toujours les moins compliquées.... Heu, pardon, les meilleures.
Plus tu donneras de responsabilité à l'une de tes classes ou à l'une de tes fonctions, plus le code deviendra difficile à comprendre et sujet à des bugs "incompréhensibles".
A l'inverse, plus le code d'une fonction ou d'une classe sera simple, plus tu auras facile à y trouver d'éventuelles erreurs
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
Salut salut, j'ai mise à jour mon code mais mon problème persiste...
Mon programme compile toujours parfaitement mais plante au démarrage. Je me suis rendu compte que c'est du à la création de fen_prgrammation (fen_prog = new fenProgrammation) et de l'utilisation de fen_prog.
Je crois que tu devrais séparer les donnes de l’application, de la vue. Il sera plus claire et plus simple de chercher les erreurs. Dans une démarche plus MVC.
Dans ton code, j'ai l'impression que plusieurs fonctions de fen_projet, auraient pu être dans une nouvelle classe que fournirait les donnes à interface.
les variables de seringue sont publiques? Dans ce exemple elles sont accessibles directement:
Dis-toi bien que si quelque chose devait me manquer, ce ne serait plus le vin, ce serait l'ivresse !Jean Gabin, Un Singe en Hiver
Probleme de header Qt
× 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.
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
D. Mendeleïev
Ton présent détermine ton futur et la connaissance te placera au dessus de ta génération .
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
D. Mendeleïev