无效使用不完整类型'类Ui :: dialog(QT错误)

War*_*ust 4 c++ qt

我想用一个简单的QT主窗口来打开第二个窗口或对话框。从字面上看,我遵循了QT链接“在应用程序中使用Designer UI文件”中的步骤,并遵循了单个继承示例。

但是QT给出4个错误,您将在下面看到一个快照。

现在,我要做的是我在Qt设计器中创建了一个主窗口,然后向项目添加了第二个表单,这是单击按钮时的第二个对话框窗口。因为我手动创建了表单“ mydialog.ui”,所以添加了类“ mydialog.h和mydialog.cpp”,并将“ ui-mydialog”的标头放置在源文件“ mydialog.cpp”中。

我不确定我想念什么?

下面是代码:

-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
Run Code Online (Sandbox Code Playgroud)

-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
Run Code Online (Sandbox Code Playgroud)

-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;
}
Run Code Online (Sandbox Code Playgroud)

-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()
{

}
Run Code Online (Sandbox Code Playgroud)

-main.cpp

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

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

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

-.pro文件

#-------------------------------------------------
#
# 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
Run Code Online (Sandbox Code Playgroud)

-Qt编译输出错误

编译错误

在此处输入图片说明

生成的文件Ui_mydialog.h是:

#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
Run Code Online (Sandbox Code Playgroud)

pet*_*r70 6

这是因为UI和C ++源代码文件中的名称之间存在差异。例如,如果在您的UI源代码文件中您有一个类似于“ StatusBarPart”的名称,但是在C ++文件中您的类的名称为“ StatusBar”

<class>StatusBarPart</class>
<widget class="QWidget" name="StatusBarPart">
Run Code Online (Sandbox Code Playgroud)
StatusBar::StatusBar(QWidget *parent)
    : PartBase(parent),
      ui(new Ui::StatusBar)
Run Code Online (Sandbox Code Playgroud)

然后您会看到这些错误消息。

解决方案:您可以在某些外部编辑器中编辑UI文件,并使名称相同。保存更改。编译您的应用程序。要开心 ;-)


jpo*_*o38 5

您将 ui 文件的名称与 Ui 类的名称(QtDesigner 中顶级小部件的 objectName)混合。

例如,如果 QtDesigner 看起来像这样:

在此输入图像描述

Ui::CalculatorForm无论 .ui 文件名是什么,您都会得到一个类名。

替换Ui::mydialogUi::Dialog(或生成文件中的任何类名ui_mydialog.h