我对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项目来说这是正常的吗?我在某处跳过了一步吗?更重要的是,解决这个问题的最佳方法是什么?
答案 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_*.h
中User Interface Compiler生成的类的名称(在您的情况下为ui_mainwindow.h
)可以通过更改来控制设计者主窗口的objectName
属性:
最有可能的是,您已将其更改为其他内容。这将导致您的代码(在文件mainwindow.h
,mainwindow.cpp
中编写)与来自UIC的自动生成代码(在文件ui_mainwindow.h
中)之间的不一致。前者继续将该类称为MainWindow
而后者的名称已更改。
由于Ui::MainWindow
是mainwindow.h
中的前向声明,因此它变为不完整的类型(因此会出现错误)。因为它的定义(在ui_mainwindow.h
中生成)是以不同的名称完成的。