2015-12-22 480 views
2

我想用按钮打开一个简单的QT主窗口来打开第二个窗口或对话框。我直接从QT链接“在应用程序中使用设计器UI文件”开始,并遵循单继承示例。不完整类型'class Ui :: dialog(QT错误)的使用无效

但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 

- 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(); 
} 

- 该.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 

- Qt的编译输出错误

Compilation error

生成的文件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 
+2

您有一个名为'mydialog'两类:在'命名空间Ui'在一个全局命名空间和一个(不完全)。 –

+0

@AntonSavin,QT网站并没有提出这样的警告,或者给出了如何处理它的答案。我在QT SDK的示例中查看了终端项目,他们和我一样。你如何在Ui命名空间中完成课程。我只有一个类 – Warrior4just

+0

也许会添加'ui_mydialog.h'文件的内容。 –

回答

2

你是混合的UI类的名称UI文件的文件名(的对象名QtDesigner中的顶级小部件)。

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

enter image description here

你会得到一个类名Ui::CalculatorForm,无论的.ui文件名。

更换Ui::mydialog通过Ui::Dialog(或任何类名是在生成ui_mydialog.h文件)

相关问题