从零开始学Qt – 06:探索UI文件设计与运行机制

通过Qt Creator开发一个GUI应用程序,会生成多个项目源文件,这些文件是如何联系在一起工作的呢?我们通过界面编辑器设计的可视化程序界面是如何封装在类里面的呢?为了弄懂这些问题,本篇文章对基于Qt的UI文件设计和运行机制进行了探讨。

首先创建一个示例程序项目。在Qt Creator中新建一个Widget Application项目(命名为samp2),窗口基类为QWidget(为了方便后续说明)。示例程序创建完成后,编译并正常运行一次程序。项目所包含的源文件以及输出目录的文件见图1所示。

在这些文件中,与UI界面相关的主要有以下几个文件:

文件名

说明

widget.h

窗体类的定义头文件

widget.cpp

widget.h定义的窗体类的实现文件

widget.ui

窗体界面文件,由UI设计器自动生成,存储了窗体上各个组件的属性设置和布局

ui_widget.h

编译后,根据窗体上的组件及其属性、信号与槽的关联等自动生成的一个类定义文件,类名称为Ui_Widget。

想要弄明白UI界面文件的原理和运行机制,需要仔细阅读一下上述几个文件的内容。但是对于编程小白来讲,也许并不想看太多的代码。因此,我在尝试理解了UI的运行原理后,绘制了如图2所示的关系图。

在Qt Creator中进行可视化界面设计后,结果会被保存在widget.ui文件中。该文件是基于XML描述的,我们也不需要多看。

在程序编译之后,其输出目录中会自动生成一个ui_widget.h文件,该文件正是根据widget.ui生成的C++程序代码。其中定义了一个类Ui_Widget,成员为在界面上添加的各个组件的指针,以及用于创建组件和设置参数的成员函数setupUi()。另外,文件中还定义了一个命名空间Ui,在其中定义了一个从Ui_Widget继承而来的类Widget。

widget.h和widget.cpp定义了窗口类Widget。注意这个Widget与Ui空间中的Widget是不同的(下面用Ui::Widget表示)。Widget类中有一个成员对象为ui,类型为Ui::Widget。在Widget的构造函数中调用了ui的setupUi成员函数来创建界面组件。因此,简单地说,Widget类中所有对界面组件的访问都是通过ui这个指针变量实现的。

最后,在主程序文件main.cpp中,创建一个窗口类Widget对象并显示和运行程序。

总结一下,ui_widget.h文件里实现界面功能的类是Ui_Widget,再定义一个类Widget是从Ui_Widget继承而来,并且在命名空间Ui里。这样Ui::Widget与widget.h里面的类Widget同名,但是可以用命名空间区分开来。所以,界面的Ui::Widget类与窗口的Widget类其实是两个类。Qt的处理让用户感觉不到Ui::Widget类的存在,只需要知道在Widget类里用ui指针可以访问可视化设计的界面组件就可以了。

在本文中,我们简单研究了UI界面文件的原理和运行机制。希望有助于增强对于Qt的GUI应用程序开发的理解。

觉得有用的话,希望大家多多关注评论转发,谢谢。

原文链接:,转发请注明来源!