QT中,添加一个新的窗体不如VC中那么方便,我们都知道VC或者C#中添加一个窗体,添加完后直接会生成对应的头文件和源代码文件。但在QT中如果你直接想在这个窗体设计器上为其添加代码(如给按钮增加click事件),则会弹出下面的对话框。
看到这个对话框,我们的第一反应是在工程中为其添加对应的头文件和资源代码文件,但这仅是我们的一厢情愿,这个对话框依旧存在。那么问题出在哪里呢?
(首先我猜测,你一定在添加窗体的时候选择的是没有类支持的窗体,也就是QT designer form,而不是QT Designer Form Class)
注意观察上面的提示,No documents matching “ui_mainwindow.h” could be found,也就是说它默认需要的是ui_mainwindow,而我们可能就没有满足它的要求,而是根据窗体名mainwindow.ui将头文件写成了mainwindow.h。
也许执拗的你还是不习惯将名字写成ui_mainwindow.h,你中意的是mainwindow.h,怎么办呢?
首先我们来到调试运行目录,果然发现了他们的踪迹:
打开他们我们发现,在这个文件中是描述的窗体的各类控件和元素的生成。按照道理来说已经没有什么问题了哦,怎么就会找不到它呢?
我们首先尝试再建立一个窗体,但这次我们直接通过QT Designer Form Class来建立一个窗体,看看QT Designer Form Class与QT Designer Form两种方式的差异在哪里。
在没有编译前后,发现与第一种方式相比没有什么变化,唯一不同的是在mainwindow.h中有对ui_mainwindow.h的描述和引用。
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
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_mainwindow.h的出处啦,每次说找不到ui_mainwindow.h就是这里应该有描述,而我们通过第一种方式新建的From中缺少了它。
我们做一个实验,将项目中现有的mainwindow.ui删除,而采用QT Designer Form方式添加mainform.ui的form,结果发现添加PushButton的click事件时没有说不能匹配ui_mainwindow.h。
至此,我们将所有与mainwindow有关的ui,h,cpp文件都删除,通过QT Designer Form方式重新建立这三个文件,并且将上面的代码拷贝进入头文件,看看结果如何?
通过测试,我们将上述cpp代码和头文件代码分别拷贝到新建的cpp和h文件中,再给UI中添加一个按钮,并且给按钮添加click事件,非常正常,没有报错。
从上述的试验得知,其实只要在cpp文件中添加ui_mainwindow.h的包含引用即可避免这个报错发生,问题得到解决。