PDA

Afficher la version complète : [Réglé] QApplication: No such file or directory



moniroje
17/08/2014, 20h09
Hello!!!
Bon, je vous demande à vous parce que au site du Zéro où je sévis pour la programmation, soit ils en ont marre de moi, soit c'est Août et ils se prélassent au bord de l'eau en regardant leurs orteils bronzer.
Ben oui, là:
http://fr.openclassrooms.com/forum/sujet/include-fenetres-h-n-a-pas-marche
ils ne répondent plus!!!
Alors voilà: j'avais fait un projet: Fenetres pour suivre mon cours et il marchait impec.
J'ai voulu faire un autre projet: FenetreA avec une classe-fille héritant de la classe Fenetres; ci-dessous les deux fichiers-headers qui occupent donc le projet FenetreA.
Le pb: quand je compile, ça me balance l'erreur:

FenetreA/Fenetres.h:3: erreur : QApplication: No such file or directory
#include <QApplication>
et ça, je pige pas: #include <QApplication> mis dans le projet Fenetres et no problem; alors pourquoi ici ça foire?
Le Fenetres.h, classe-mère:

#ifndef FENETRES_H
#define FENETRES_H

// la classe-mère:

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QLCDNumber>
#include <QProgressBar>
#include <QSlider>

class Fenetres : public QWidget
{
Q_OBJECT

public slots:
void changerLargeur(int largeur);
void changerHauteur(int hauteur);

signals:
void largeurMaxi();

public:
Fenetres();

private:
QPushButton *m_quitter;
QLCDNumber *m_lcd;
QProgressBar *m_ProgressBar;
QSlider *m_slider;
QSlider *m_largeur;
QSlider *m_hauteur;
QPushButton *m_reset;

};

#endif // FENETRES_H
et le FenetreA.h soit la classe-fille:

fndef FENETREA_H
#define FENETREA_H

// La classe-fille:

#include "Fenetres.h"
#include <QApplication> /* la compil envoie: QApplication: No such file or
* directory */
#include <QWidget>
#include <QPushButton>
#include <QLCDNumber>
#include <QProgressBar>
#include <QSlider>
#include <QMessageBox>

class FenetreA : public Fenetres
{
Q_OBJECT

public slots:

public:
FenetreA();

private:
QPushButton *m_boutonDialogue();

};

#endif // FENETREA_H

posophe
17/08/2014, 23h31
Je veux pas t’embêter avec des détails mais c'est normal qu"il n' y ait pas d'extension aux headers inclus ?

jupar
18/08/2014, 08h57
FenetreA/Fenetres.h:3: erreur : QApplication: No such file or directory
#include <QApplication>


En fait le compilateur commence par aller dans FenetreA.h, il voit le include de Fenetres.h, il y va, et là il rencontre le premier include de QApplication (donc le problème est plutôt dans Fenetres.h)

Au delà de ce détail sur le message du compilo, est-ce que tu as regardé du coté de ton fichier projet ? (le fichier .pro) Tout est correct au niveau des paths par rapport à ton précédent projet qui fonctionnait ?

++
J

moniroje
18/08/2014, 12h28
Hello posophe!
ben non, c'est pas un détail! Mais j'ai appris qu'en Qt, on ne met pas les extensions. Attends, je regarde mon tuto:
http://fr.openclassrooms.com/informatique/cours/programmez-avec-le-langage-c/compiler-votre-premiere-fenetre-qt
où il écrit:

#include <QApplication>



C'est le seul include dont vous avez besoin au départ. Vous pouvez oublier iostream et compagnie, avec Qt on ne s'en sert plus.
Vous noterez qu'on ne met pas l'extension « .h », c'est voulu. Faites exactement comme moi.
Cet include vous permet d'accéder à la classe QApplication, qui est la classe de base de tout programme Qt.


@jupar!!! hiii!!! ton premier message pour ma pomme!!! merci et bienvenue chez Alionet
Bon, j'y pense ... à ta réponse...
J'ai eu le même raisonnement: compil commence par FenetreA.h of course... et là, il voit #include <QApllication> comme tout projet Qt qui se respecte, tiens, il voit aussi #include "Fenetres.h"; il y va et oups, il voit encore #include <QApllication> et il ne doit pas aimer.
J'ai donc enlevé le #include <QApllication> à FenetreA.h qui est classe-fille héritant de Fenetres.h qui l'a déjà. et compile => hélas, le même message!!!
Chuis pourtant bien obligé de garder ce #include <QApllication> à la classe-mère!!! il sert pour toute la classe-mère, il le lui faut!!

Côté fichier projet: dans mon projet Fenetres.pro:

QT += widgets
SOURCES += \
main.cpp \
Fenetres.cpp

HEADERS += \
Fenetres.h
et dans mon projet FenetreA.pro:

HEADERS += \
FenetreA.h \
Fenetres.h

SOURCES += \
FenetreA.cpp \
main.cpp
OK, je n'avais pas mis la ligne QT += widgets parce que on m'avait dit que avec un Qt récent, yavait plus besoin.
Celui avec lequel je tourne aujourd'hui est Qt 5.3.1; je compile: à nouveau cette erreur malgré tout.
Je rajoute QT += widgets au FenetreA.pro, je compile et houla!!! plein d'erreurs!!! dans le .cpp cette fois-ci: aurai-je avancé auquel cas il faut cette ligne dans le .pro? n'empêche, cette erreur mais dans le .cpp:

FenetreA/FenetreA.cpp:9: error: type 'QWidget' is not a direct base of 'FenetreA'
FenetreA::FenetreA(): QWidget()
semble être toujours mon problème!
Les autres erreurs, c'est parce que je suis au niveau de mon apprentissage et que je n'ai sans doute pas bien compris...
Mon fichier .cpp avec les erreurs en comment:


#include "FenetreA.h"

//########################### Début du constructeur:################################
FenetreA::FenetreA(): QWidget() // error: type 'QWidget' is not a direct base of 'FenetreA'
FenetreA::FenetreA(): QWidget()
{
setFixedSize (650, 400);

m_boutonDialogue() = new QPushButton(" Tu ouvres cette boîte de dial ", this);
// ligne ci-dessus: error: lvalue required as left operand of assignment ce qui signifie?
m_boutonDialogue() = new QPushButton(" Tu ouvres cette boîte de dial ", this);
^
m_boutonDialogue() -> move(40,50);

QObject::connect(m_boutonDialogue, SIGNAL(clicked()), this, SLOT(ouvrirDialogue()));
// ligne ci-dessus: error: invalid use of non-static member function
}
//########### fin du constructeur; ci-dessous les autres méthodes #####################
void FenetreA::ouvrirDialogue()
{
void QMessageBox::AfficherMessage();
// ligne ci-dessus: error: qualified-id in declaration before '(' token

}

jupar
18/08/2014, 13h05
de rien, et nop ce n'est pas mon premier message ici, mais je postais un peu il y a longtemps...et je me suis arrété, et quand j'ai voulu reprendre je ne me souvenais plus de mon login/mdp/email contact de alionet => nouveau profil mais pas tout à fait nouveau message....

donc pour ça:


J'ai eu le même raisonnement: compil commence par FenetreA.h of course... et là, il voit #include <QApllication> comme tout projet Qt qui se respecte, tiens, il voit aussi #include "Fenetres.h"; il y va et oups, il voit encore #include <QApllication> et il ne doit pas aimer.

Ce n'est pas vraiment un probleme, les #ifndef au départ des .h servent à éviter ce genre de problèmes, ce que je voulais dire et c'est un peu du détail, c'est que tu avais commenté ton fenetreA.h comme ciblant l'erreur alors que pour le compilateur, l'erreur était plutôt du coté du fenetre.h. Bref tu peux laisser le QApplication partout, c'est pas le fait qu'il y soit 2 fois qui pose problème..

Pour ce qui est du Qwidget, tu as un problème sur l'héritage, tres vite car je n'ai pas trop le temps là, je pense qu'il faudrait quelque chose comme ça :



FenetreA::FenetreA(QWidget *parent)


: QWidget(parent)

linux5623
18/08/2014, 19h27
Je pense que le problème viens simplement du fait que Fenetres dérive que QWidget au lieu de QMainWindow.

moniroje
21/08/2014, 18h04
Bon, le site du zéro est revenu de vacances et ils m'ont bien aidé:
http://fr.openclassrooms.com/forum/sujet/include-fenetres-h-n-a-pas-marche
Pour résumer: si tu veux utiliser dans un projet une classe-fille FenetreA héritant de la classe-mère Fenetres il faut:
1°) #include "Fenetres.h" dans le fichier FenetreA.h
2°) dans le prototype de la classe FenetreA que l'on crée, rappeler cette parenté par public Fenetres:
class FenetreA : public Fenetres
3°) adjoindre dans le projet les fichiers .h et .cpp de la classe-mère
4°) dans le fichier .pro du projet signaler dans les headers: Fenetres.h \
et dans les sources: Fenetres.cpp \
Voilà voilà... :D