- A+
用vs新建一个GuiClass时(如a.ui),会同时在Header Files中生成一个a.h头文件,在Source Files中生成一个a.cpp文件,另外,还会在Generated Files中生成一个ui_a.h文件,其中,ui_a.h文件实际并不存在(不信可以去Generated Files文件夹下找找,在目录树上点击该文件,提示“无法打开文档。它已被重命名、删除或移动”),这里只是个占位的作用,防止用户在编译该ui文件之间新建了同名的ui_a.h文件。只有在新建a.ui文件后,编译该工程,才会自动生成一个ui_a.h文件,因此,不要手动修改ui_a.h文件,如果需要修改,去a.ui修改,然后编译,会自动将修改更新到ui_a.h文件。
ui_a.h和a.ui的关系
ui_a.h是a.ui文件的代码化表达,a.ui是ui_a.h的可视化表达。ui_a.h中有成员变量和两个成员函数,但凡是在a.ui拖拉的控件,都会在成员变量中进行定义。两个成员函数分别是void setupUi(T *t)和void retranslateUi(T *t),setupUi负责对界面的大小、位置进行控制,retranslateUi负责对界面的翻译内容进行控制,install翻译文件时会回调该函数。其中的(T *t)的T和新建UI时选择的界面类型对应(如果该UI是Dialog对话框,则T为QDialog;如果为窗口部件,则T为QWidget)。ui_a.h并不是实际的界面对象,实际的界面对象是t。
(a.cpp、a.h)和ui_a.h的关系
ui_a.h中的两个成员函数都需要提供(T *t),这个t其实就是盛放用户拖拽控件的父容器,用户需要提供这样一个容器,(a.cpp、a.h)就提供了这样一个容器,a.cpp一定是继承了一个容器控件(如class a : public QWidget{}),因此,这个类本身的作用其实就是充当父容器,使用这句话ui.setupUi(this)完成了子控件和父容器的关联,this会传入setupUi中进行子控件的绑定。
最终,其实这里的this就代表了你要创建的ui界面,而你所拖拽的子控件也就和this进行了关联,this不方便访问子控件,a.h中的Ui::a ui中的ui可以很方便的访问子控件。
a.cpp、a.h可以删除
a.cpp、a.h可以删除,直接在其他cpp文件中进行使用,如
Ui::a a;
QTabWidget *tabWidget = new QTabWidget(this);
QWidget *w1 = new QWidget;
a.setupUi(w1);
//w1是父容器,即代表你所创建的ui界面,a负责将w1和子控件进行绑定,a只是一个简单的类,并不是界面类
tabWidget->addTab(w1,"First");