Warrior4just
Warrior4just

Reputation: 129

Invalid use of incomplete type 'class Ui::dialog (QT error )

I would like to make a simple QT mainwindow with the button to open a second window or dialog. I followed literally the step from the QT link "Using a Designer UI File in Your Application" and following the single inheritance example.

But QT gives 4 errors , which you will see a snapshot of below.

Now, what I did is I created a mainwindow in Qt designer, then I added a second form to the project , which will be the second dialog window when a button clicked. Because I created the form manually "mydialog.ui", I added class "mydialog.h and mydialog.cpp" and put the header of "ui-mydialog" in the source file "mydialog.cpp".

I' not sure what am I missing ?

Below is the code :

- mydialog.h

#ifndef MYDIALOG_H 
#define MYDIALOG_H
#include<QWidget>

class mydialog ;

namespace Ui {
class mydialog;
}

class mydialog : public QWidget
{
    Q_OBJECT

public:

    explicit mydialog(QWidget *parent = 0);
    virtual ~mydialog();
private :

    Ui::mydialog *ui;

};

#endif // MYDIALOG_H

- mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtCore/QtGlobal>
#include <QMainWindow>

QT_USE_NAMESPACE
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class mydialog;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_Start_clicked();

private:
    Ui::MainWindow *ui;
    mydialog *dialog1;
};

#endif // MAINWINDOW_H

- mydialog.cpp

#include"mydialog.h"
#include "ui_mydialog.h"


mydialog::mydialog(QWidget *parent) :  QWidget(parent), ui(new Ui::mydialog)
{
  ui->setupUi(this);
}


mydialog::~mydialog()
{
    delete ui;
}

- mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include"mydialog.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    dialog1 = new mydialog ;
}

MainWindow::~MainWindow()
{
    delete ui;
    delete dialog1;
}

void MainWindow::on_Start_clicked()
{

}

- main.cpp

#include"mainwindow.h"
#include<QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

- The .pro file

#-------------------------------------------------
#
# Project created by QtCreator 2015-12-17T00:10:58
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = TestTool
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    mydialog.cpp

HEADERS  += mainwindow.h \
    mydialog.h

FORMS    += mainwindow.ui \
    mydialog.ui

RESOURCES += \
    misc.qrc

- Qt compilation output error

Compilation error

enter image description here

The generated file Ui_mydialog.h is :

#ifndef UI_MYDIALOG_H
#define UI_MYDIALOG_H

#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QDialog>
#include <QtWidgets/QDialogButtonBox>
#include <QtWidgets/QHeaderView>

QT_BEGIN_NAMESPACE

class Ui_Dialog
{
public:
    QDialogButtonBox *buttonBox;

    void setupUi(QDialog *Dialog)
    {
        if (Dialog->objectName().isEmpty())
            Dialog->setObjectName(QStringLiteral("Dialog"));
        Dialog->resize(400, 300);
        buttonBox = new QDialogButtonBox(Dialog);
        buttonBox->setObjectName(QStringLiteral("buttonBox"));
        buttonBox->setGeometry(QRect(30, 240, 341, 32));
        buttonBox->setOrientation(Qt::Horizontal);
        buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);

        retranslateUi(Dialog);
        QObject::connect(buttonBox, SIGNAL(accepted()), Dialog, SLOT(accept()));
        QObject::connect(buttonBox, SIGNAL(rejected()), Dialog, SLOT(reject()));

        QMetaObject::connectSlotsByName(Dialog);
    } // setupUi

    void retranslateUi(QDialog *Dialog)
    {
        Dialog->setWindowTitle(QApplication::translate("Dialog", "Dialog", 0));
    } // retranslateUi

};

namespace Ui {
    class Dialog: public Ui_Dialog {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MYDIALOG_H

Upvotes: 7

Views: 25690

Answers (2)

peter70
peter70

Reputation: 1113

This is because of the diferences between the names in your UI- und C++sourcecode files. For example if in your UI-sourcecode file you have a name like "StatusBarPart" but the name of your class in the C++ file is "StatusBar"

<class>StatusBarPart</class>
<widget class="QWidget" name="StatusBarPart">

StatusBar::StatusBar(QWidget *parent)
    : PartBase(parent),
      ui(new Ui::StatusBar)

then you you get these error message you see.

Solution: You can edit the UI file in some external editor and make the names equal. Save changes. Compile your app. Be happy ;-)

Upvotes: 11

jpo38
jpo38

Reputation: 21514

You are mixing the name of the ui file with the name of the Ui class (objectName of the top level widget in QtDesigner).

For example, if QtDesigner looks like that:

enter image description here

You'll get a class names Ui::CalculatorForm, whatever the .ui file name is.

Replace Ui::mydialog by Ui::Dialog (or whatever the class name is in your generated ui_mydialog.h file)

Upvotes: 5

Related Questions