1. 问题初现:当“不完整的类型”错误找上门
相信很多刚开始用Visual Studio 2015搭配QT做界面开发的朋友,都遇到过这个让人瞬间血压升高的编译错误:“不允许使用不完整的类型”。我当年第一次碰到时,也是一头雾水,看着IDE里那行熟悉的#include "ui_MyWidget.h",心里直犯嘀咕:文件明明就在那儿,路径也对,怎么编译器就跟瞎了似的,非说我的Ui::MyWidgetClass是个不完整的类型呢?
这个错误信息听起来有点抽象,咱们用大白话翻译一下。编译器在编译你的.cpp源文件时,遇到了一个类的声明(比如Ui::MyWidgetClass),但它只看到了这个类的名字,却没找到这个类的“完整定义”——也就是这个类具体长什么样,里面有哪些成员变量和函数。在C++的世界里,你要使用一个类(比如用它来声明变量、访问成员),编译器必须知道这个类的完整布局。这就好比你要给我寄个快递,只写我的名字不行,必须得有我的详细家庭住址,快递员才知道该往哪儿送。“不完整的类型”错误,就是编译器在抱怨:“你只给了我一个名字,我没法干活啊!”
而在VS2015+QT这个组合里,九成九的情况下,这个错误的根源都指向了那个神秘的ui_xxx.h文件。这个文件并不是我们手动编写的,它是QT的用户界面编译器(uic) 根据我们设计的.ui界面文件自动生成的。这个文件里,正包含了那个“类的完整定义”。所以,一旦这个环节出了岔子——要么文件根本没生成,要么生成了但里面的类名和我们代码里引用的对不上号——编译器立马就会抛出这个错误。
我踩过这个坑,也帮不少同事解决过。很多时候,我们一通操作猛如虎,又是清理解决方案又是重启VS,结果问题依旧。其实,解决这个问题的关键,在于理解QT在VS2015这个环境下的“自动化”工作流程,并学会手动去检查和干预这个流程。下面,我就把自己这些年总结的排查心法,一步步拆开揉碎了讲给你听。
2. 深度排查:三步锁定问题真凶
当错误出现时,别急着去网上漫无目的地搜索,那样效率太低。我们应该像侦探一样,系统地、有步骤地缩小嫌疑范围。我总结了一个“三步定位法”,亲测非常有效。
2.1 第一步:检查文件是否存在与生成路径
这是最基础,但也最容易被忽略的一步。我们代码里写的是#include "ui_MyWidget.h",那这个文件到底在不在它该在的地方呢?
在VS2015的解决方案资源管理器里,找到你的.ui文件(比如MyWidget.ui)。右键点击它,你应该能看到一个“编译”的选项。点击它,VS会调用uic工具来生成对应的ui_MyWidget.h文件。但是,这个生成的文件默认并不直接显示在你的项目列表里,它被输出到了一个特定的目录。
对于使用QT Visual Studio Tools(以前叫QT插件)的项目,这个目录通常是项目文件夹下的一个叫GeneratedFiles的子文件夹(也可能是ui_开头)。你需要去这个文件夹里实地检查一下:
- 打开Windows文件资源管理器,导航到你的项目根目录。
- 找到
GeneratedFiles文件夹(注意大小写)


379

被折叠的 条评论
为什么被折叠?



