IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Erreur : aggregate 'Ui::inventaire ui' has incomplete type and cannot be defined

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Par défaut Erreur : aggregate 'Ui::inventaire ui' has incomplete type and cannot be defined
    Bonjour à tous,

    Je travail sur Qt Designer et j'ai essayé de compiler mais une erreur s'affiche. J'ai effectué quelques recherches sur les forums à propos de cette erreur mais je crois avoir manqué la réponse à mon soucis..

    Voici mon code :

    .h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #ifndef INVENTAIRE_H
    #define INVENTAIRE_H
     
    #include <QDialog>
    #include <QWidget>
     
    namespace Ui {
    class inventaire;
    }
     
    class inventaire : public QDialog
    {
        Q_OBJECT
     
    public:
        explicit inventaire(QWidget *parent = 0);
        ~inventaire();
     
    private:
        Ui::inventaire *ui;
    };
     
    #endif // INVENTAIRE_H
    .cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include "inventaire.h"
    #include "ui_inventaire.h"
     
    inventaire::inventaire(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::inventaire)
    {
        ui->setupUi(this);
    }
     
    inventaire::~inventaire()
    {
        delete ui;
    }
    le main.cpp (c'est pour la ligne 10 du main que l'erreur s'affiche)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <QApplication>
    #include "inventaire.h"
    #include <QWidget>
     
     
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        QWidget *widget = new QWidget;
        Ui::inventaire ui;
        ui->setupUi(widget);
     
        widget->show();
        return app.exec();
    }
    Erreur : aggregate 'Ui::inventaire ui' has incomplete type and cannot be defined

    Je débute sur Qt alors il est possible que l'erreur soit logique mais ma logique est encore en plein développement..

    Merci pour votre aide.

  2. #2
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 736
    Par défaut
    Bonjour.

    Qt effectue un truc bizarre (selon moi) quand il défini deux fois la même classe (ici inventaire), l'un dans le namespace global, l'autre dans ui, pour une raison obscure que je ne connais pas.

    Ça a dû te porter à confusion car tu écris dans la ligne Ui::inventaire ui;, là où il faut utiliser la classe du namespace global plutôt, donc inventaire ui;.

    Petit détail, on a l'habitude de commencer le nom des classes en capitale, Inventaire plutôt qu'inventaire.

    Pour l'explication de l'erreur, Ui::inventaire correspond à la déclaration suivante où on voit bien que la classe est déclarée, mais pas définie (donc incomplète selon l'erreur).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    namespace Ui {
    class inventaire;
    }
    C'est tout à fait légal de faire ça en C++.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Par défaut
    Merci Daïmanu pour ton explication ! Je comprends maintenant.
    Cependant, j'ai modifié mon code en modifiant le
    Ui::inventaire ui;
    par
    inventaire ui;
    et une autre erreur s'affiche (que ferait-on sans ces erreurs.. )

    erreur : 'class inventaire' has no member named 'setupUi'
    ui.setupUi(widget);
    ^

    Cela signifie certainement que je dois déclarer ce fameux setupUi dans ce fameux code que tu as évoqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    namespace Ui {
    class inventaire;
    }
    Je n'ai pas de grandes idées sur la façon dont déclarer ceci mais je sens que j'approche de mon résultat.

  4. #4
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 736
    Par défaut
    Si tu remarques bien, Qt a déjà généré l'appel à setupUi() dans le constructeur d'inventaire, il n'est pas nécessaire de l'appeler à nouveau.

    Tu peux donc retirer la ligne ui->setupUi(widget); de ta fonction main() ainsi que le widget qui n'est pas utile.

    Ton main devrait ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <QApplication>
    #include "inventaire.h"
    #include <QWidget>
     
     
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        inventaire ui;
        ui.show();
        return app.exec();
    }

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2018
    Messages : 7
    Par défaut
    En effet, j'avais remarqué que l'appel était généré dans le .cpp de la classe inventaire mais je ne pensais pas que cela suffisait.. "pourquoi faire simple quand on peut faire compliqué" tel est mon fardeau.. Ca fonctionne parfaitement.
    Merci infiniment Daïmanu

    Sujet résolu ✔

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de compilation : has incomplete type
    Par Plomeg dans le forum C++
    Réponses: 2
    Dernier message: 25/04/2009, 13h19
  2. Table has dependent keys and cannot be dropped
    Par psgman113 dans le forum Débuter
    Réponses: 1
    Dernier message: 12/03/2009, 18h16
  3. has initializer but incomplete type
    Par laflak dans le forum C
    Réponses: 3
    Dernier message: 25/03/2008, 18h05
  4. Réponses: 3
    Dernier message: 23/01/2008, 16h04
  5. has incomplete type,forward declaration of ,
    Par Pragmateek dans le forum C++
    Réponses: 12
    Dernier message: 22/07/2006, 15h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo