窗口部件
QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,QWidget类是所有用户界面对象的基类,被称为基础窗口部件。QWidget继承自QObject类和QPaintDevice类,其中,QObject类是所有支持Qt对象模型的对象的基类,QPaintDevice类是所有可以绘制对象的基类。
新建Qt Widgets应用
新建HelloworldDialog类,基类QDialog。在Qt Creator的编辑模式下双击项目文件列表中界面文件分类下的helloworlddialog.ui,进入设计模式。从部件列表中找到Label部件,然后按住鼠标左键将它拖到主设计区的界面上,再双击它进入编辑状态后输入“Hello World!”字符串。
helloworld.pro该文件是项目文件,其中包含了项目相关信息。helloworlddialog.h该文件是新建的HelloworldDialog类的头文件。helloworlddialog.cpp该文件是新建的HelloworldDialog类的源文件。helloworlddialog.ui该文件是设计师设计的界面对应的界面文件。
Ui_HelloworldDialog类是由Qt用户界面编译器针对UI界面编译生成的。这个类包含了QLabel指针和void setupUi(QDialog *HelloworldDialog)
以及void retranslateUi(QDialog *HelloworldDialog)
函数。
在命名空间中,可以看到HelloworldDialog继承自这个Ui_HelloworldDialog类。
在helloworlddialog.h头文件中可以看到HelloworldDialog也继承自QDialog类,这是我们建立工程时设置的。类里有一个私有变量,其指向自己类型的对象。
其构造和析构函数的实现如下所示:
在构造函数中setupUi是其父类Ui_HelloworldDialog的方法,用于建立UI。
直接使用代码实现
直接添加main.cpp文件,这里的代码需要QApplication、QDialog和QLabel这3个类。QDialog在helloworlddialog.h头文件中已经包含了。通过QDialog实例化一个对话框界面。新建一个QLabel对象,并将QDialog对象作为参数,表明对话框是它的父窗口,也就是说这个标签放在对话框窗口中。在默认情况下,新建的可视部件对象都是不可见的,要使用show函数让它们显示出来。QApplication对象的exec进入事件循环,这样Qt应用程序运行时便可以接收产生的事件。
使用.ui文件
在模板中选择Qt中的Qt Designer Form,在选择界面模板时选择Dialog without Buttons项,单击下一步,将文件名称改为hellodialog.ui。ui文件其实是XML文件,里面是界面部件的相关信息。
由ui文件生成的ui_hellodialog.h头文件,下面是具体内容。是由Qt用户界面编译器5.9.9生成的代码,并且手动对该文件改动,再次编译ui文件时会丢失。
setupUi()函数用来生成界面,因为当时选择模板时使用的是对话框,所以现在这个函数的参数是QDialog类型的。第29行和30行设置了对话框的对象名称。第31行设置了窗口的带下。第32-34行在对话框上创建了标签对象,并设置了它的对象名称、大小和位置。第36行调用了retranslateUi()函数,这个函数在第41-45行进行了定义,实现了对窗口里的字符串进行编码转换的功能。第38行调用了QMetaObject类的connectSlotsByName()静态函数,使得窗口中的部件可以实现按对象名进行信号和槽的关联。
这里的HelloDialog是ui_hellodialog.h头文件中定义的继承自Ui_HelloworldDialog的类。
布局管理器
Qt主要提供QLayout类及其子类作为布局管理器,它们可以实现常用的布局管理功能。Qt的布局管理关系提供了强大的机制来自动排列窗口中的所有部件,确保它们有效地使用空间。
所有QWidget的子类的实例(对象)都可以使用布局管理器管理位于它们之中的子部件,QWidget::setLayout()函数可以在一个部件上应用布局管理器。一旦一个部件上设置了布局管理器,那么它会完成以下几种任务:定位子部件;感知窗口默认大小;感知窗口最小大小;窗口大小变化时进行处理;当内容改变时自动更新(字体大小、文本或子部件的其他内容随之改变,隐藏或显示子部件,溢出一个子部件)
QLayout类是布局管理器的基类,是一个抽象基类,继承自QObject和QLayoutItem类,QLayoutItem类提供了一个供QLayout操作的抽象项目。QLayout和QLayoutItem都是都是在设计自己的布局管理器时才使用的,一般只需要使用QLayout的几个子类即可。它们分别是QBoxLayout(基本布局管理器)、QGridLayout(栅格布局管理器)、QFormLayout(窗体布局管理器)和QStackedLayout(栈布局管理器)。
基本布局管理器
基本布局管理器QBoxLayout类可以使子部件在水平方向或者垂直方向排成一列,它将所有的空间分成一行盒子,然后将每个部件放入一个盒子中。它有两个子类QHBoxLayout水平布局管理器和QVBoxLayout垂直布局管理器。
栅格布局管理器
栅格布局管理器QGridLayout类使部件在网格中进行布局,它将所有的空间分隔成一些行和列,行和列的交叉处形成了单元格,然后将部件放入一个确定的单元格中。
窗体布局管理器
窗体布局管理器QFormLayout类用来管理表单的输入部件以及与它们相关的标签。窗体布局管理器将它的子部件分为两列,左边是一些标签,右边是一些输入部件,比如行编辑器或者数字选择框等。
QT Creator快速入门读书笔记:新建HelloWorld工程
QT Creator快速入门读书笔记:窗口部件初探