El problema es que su uipropiedad usa una declaración de clase hacia adelanteUi::MainWindowClass , de ahí el error "tipo incompleto".
Incluir el archivo de encabezado en el que se declara esta clase solucionará el problema.
EDITAR
Basado en su comentario, el siguiente código:
namespace Ui
{
class MainWindowClass;
}
no no declarar una clase. Es una declaración hacia adelante , lo que significa que la clase existirá en algún momento, en el momento del enlace.
Básicamente, solo le dice al compilador que el tipo existirá y que no debería advertir sobre él.
Pero la clase debe definirse en alguna parte .
Tenga en cuenta que esto solo puede funcionar si tiene un puntero a dicho tipo.
No puede tener una instancia asignada estáticamente de un tipo incompleto.
Entonces, o realmente desea un tipo incompleto, y luego debe declarar su uimiembro como un puntero:
namespace Ui
{
class MainWindowClass;
}
class MainWindow : public QMainWindow
{
private:
Ui::MainWindowClass * ui;
};
O desea una instancia de asignada estáticamente Ui::MainWindowClass, y luego debe declararse. Puede hacerlo en otro archivo de encabezado (generalmente, hay un archivo de encabezado por clase).
Pero simplemente cambiando el código a:
namespace Ui
{
class MainWindowClass
{};
}
class MainWindow : public QMainWindow
{
private:
Ui::MainWindowClass ui;
};
también funcionará.
Note la diferencia entre las dos declaraciones. Primero usa una declaración hacia adelante, mientras que el segundo realmente declara la clase (aquí sin propiedades ni métodos).