Le problème est que votre ui
utilise un déclaration prospective de la classe Ui::MainWindowClass
d'où l'erreur de "type incomplet".
L'inclusion du fichier d'en-tête dans lequel cette classe est déclarée résoudra le problème.
EDITAR
Sur la base de votre commentaire, le code suivant :
namespace Ui
{
class MainWindowClass;
}
hace PAS déclarer une classe. C'est une déclaration prospective ce qui signifie que la classe existera à un moment donné, au moment du lien.
En gros, il indique simplement au compilateur que le type existera, et qu'il ne doit pas l'avertir.
Mais la classe doit être défini quelque part .
Notez que cela ne peut fonctionner que si vous avez un pointeur à un tel type.
Vous ne pouvez pas avoir une instance allouée statiquement d'un type incomplet.
Donc soit vous voulez réellement un type incomplet, et alors vous devriez déclarer votre ui
comme un pointeur :
namespace Ui
{
// Forward declaration - Class will have to exist at link time
class MainWindowClass;
}
class MainWindow : public QMainWindow
{
private:
// Member needs to be a pointer, as it's an incomplete type
Ui::MainWindowClass * ui;
};
Ou vous voulez une instance statiquement allouée de Ui::MainWindowClass
et il doit ensuite être déclaré. Vous pouvez le faire dans un autre fichier d'en-tête (habituellement, il y a un fichier d'en-tête par classe).
Mais il suffit de changer le code en :
namespace Ui
{
// Real class declaration - May/Should be in a specific header file
class MainWindowClass
{};
}
class MainWindow : public QMainWindow
{
private:
// Member can be statically allocated, as the type is complete
Ui::MainWindowClass ui;
};
fonctionnera également.
Notez la différence entre les deux déclarations. La première utilise une déclaration directe, tandis que la seconde déclare réellement la classe (ici sans propriétés ni méthodes).