Qt开发 Qt Designer的UI文件深入剖析 ui_*.h、*.ui、*.cpp、*.h源码解析

  • A+
所属分类:Qt专栏

Qt开发 Qt Designer的UI文件深入剖析 ui_*.h、*.ui、*.cpp、*.h源码解析

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中进行子控件的绑定。

Qt开发 Qt Designer的UI文件深入剖析 ui_*.h、*.ui、*.cpp、*.h源码解析

最终,其实这里的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");

  • 我的微信
  • weinxin
  • 微信公众号
  • weinxin
阿拉灯aladeng

发表评论

您必须才能发表评论!