为什么Qt Creator会生成不会编译的项目?

时间:2017-01-20 20:19:25

标签: c++ qt ide

我对C ++或编程并不陌生,但这是我第一次尝试使用Qt。当我创建一个新项目时,它会生成这个mainwindow.cpp文件:

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

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

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

没有触及该文件,只是在设计器中对ui文件进行了一些更改,然后尝试构建项目进行预览,我得到两个"无效使用不完整类型"线的问题 ui(new Ui::MainWindow)ui->setupUi(this);

据我所知,问题是它在实例化类之前尝试引用MainWindow。但是Creator自己生成了代码。对于一个新的Qt项目来说这是正常的吗?我在某处跳过了一步吗?更重要的是,解决这个问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

  

为什么Qt Creator会生成无法编译的项目?

没有。你做。你甚至承认了这一点。

  

只是在ui文件中进行一些更改

你已经回答了自己的问题。你打破了.ui文件。

  

但是Creator自己生成了代码。

不是真的。生成的代码所依赖的ui_mainwindow.h派生自.ui文件。从mainwindow.cpp的角度来看,.ui文件的内容同样重要。

你不能随意选择你所谓的代码和你不代表的代码。所有预生成的文件包括 .ui文件都包含项目代码。

你现在抱怨说,当你刚刚承认你改变了所说的代码时,Qt Creator会产生无用的代码

您很可能在.ui文件中更改了该类的名称,因此Ui::MainWindow中没有声明ui_mainwindow.h。回想一下,ui_mainwindow.h文件是从.ui文件生成的,通过更改.ui文件,您可以使其他文件的内容(例如.cpp文件)不正确:他们都必须提到一致的班级名称。

您可以通过点击"ui_mainwindow.h"字符串并在Qt Creator中按F2来轻松验证。它将打开头文件,您现在可以检查它以确定它声明的类(如果有)。最有可能的是,直接从您现在更改的.ui文件派生的该文件未能声明“未更改的”.cpp文件所依赖的类。

完全由您维护依赖文件以保持项目的连贯性。如果不传播必要的更改(例如,.ui中的类和成员名称到其他文件,则对一个文件(例如.ui文件)进行更改以打破其他文件的编译是正常的,完全可以预期文件)。

在执行任何其他操作之前,请删除构建文件夹并再次构建项目。如果错误仍然存​​在,请调查您在.ui文件中的内容。

将来,始终立即将任何自动生成的项目签入到版本控制中,这样您就可以更加了解在事情中断时您对代码所做的更改。初始化git存储库是一项简单的操作,并且提供了出色的工具和专有技术,使其成为一种简单的体验。如果您从一开始就没有使用版本控制,那么你做错了。

答案 1 :(得分:1)

除了the great explanation by Kuba Ober

我只想添加标题ui_*.hUser Interface Compiler生成的类的名称(在您的情况下为ui_mainwindow.h)可以通过更改来控制设计者主窗口的objectName属性:

Qt designer screenshot

最有可能的是,您已将其更改为其他内容。这将导致您的代码(在文件mainwindow.hmainwindow.cpp中编写)与来自UIC的自动生成代码(在文件ui_mainwindow.h中)之间的不一致。前者继续将该类称为MainWindow而后者的名称已更改。

由于Ui::MainWindowmainwindow.h中的前向声明,因此它变为不完整的类型(因此会出现错误)。因为它的定义(在ui_mainwindow.h中生成)是以不同的名称完成的。