窗口部件

QT Creator快速入门读书笔记:新建HelloWorld工程_布局管理器


QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,QWidget类是所有用户界面对象的基类,被称为基础窗口部件。QWidget继承自QObject类和QPaintDevice类,其中,QObject类是所有支持Qt对象模型的对象的基类,QPaintDevice类是所有可以绘制对象的基类。

新建Qt Widgets应用

新建HelloworldDialog类,基类QDialog。在Qt Creator的编辑模式下双击项目文件列表中界面文件分类下的helloworlddialog.ui,进入设计模式。从部件列表中找到Label部件,然后按住鼠标左键将它拖到主设计区的界面上,再双击它进入编辑状态后输入“Hello World!”字符串。

QT Creator快速入门读书笔记:新建HelloWorld工程_c++_02


helloworld.pro该文件是项目文件,其中包含了项目相关信息。helloworlddialog.h该文件是新建的HelloworldDialog类的头文件。helloworlddialog.cpp该文件是新建的HelloworldDialog类的源文件。helloworlddialog.ui该文件是设计师设计的界面对应的界面文件。

QT Creator快速入门读书笔记:新建HelloWorld工程_头文件_03

QT Creator快速入门读书笔记:新建HelloWorld工程_qt_04

QT Creator快速入门读书笔记:新建HelloWorld工程_布局管理器_05


QT Creator快速入门读书笔记:新建HelloWorld工程_qt_06


QT Creator快速入门读书笔记:新建HelloWorld工程_布局管理器_07

Ui_HelloworldDialog类是由Qt用户界面编译器针对UI界面编译生成的。这个类包含了QLabel指针和​​void setupUi(QDialog *HelloworldDialog)​​​以及​​void retranslateUi(QDialog *HelloworldDialog)​​函数。

QT Creator快速入门读书笔记:新建HelloWorld工程_子类_08


在命名空间中,可以看到HelloworldDialog继承自这个Ui_HelloworldDialog类。

QT Creator快速入门读书笔记:新建HelloWorld工程_头文件_09


在helloworlddialog.h头文件中可以看到HelloworldDialog也继承自QDialog类,这是我们建立工程时设置的。类里有一个私有变量,其指向自己类型的对象。

QT Creator快速入门读书笔记:新建HelloWorld工程_c++_10


其构造和析构函数的实现如下所示:

QT Creator快速入门读书笔记:新建HelloWorld工程_c++_11


在构造函数中setupUi是其父类Ui_HelloworldDialog的方法,用于建立UI。

QT Creator快速入门读书笔记:新建HelloWorld工程_c++_12

直接使用代码实现

直接添加main.cpp文件,这里的代码需要QApplication、QDialog和QLabel这3个类。QDialog在helloworlddialog.h头文件中已经包含了。通过QDialog实例化一个对话框界面。新建一个QLabel对象,并将QDialog对象作为参数,表明对话框是它的父窗口,也就是说这个标签放在对话框窗口中。在默认情况下,新建的可视部件对象都是不可见的,要使用show函数让它们显示出来。QApplication对象的exec进入事件循环,这样Qt应用程序运行时便可以接收产生的事件。

QT Creator快速入门读书笔记:新建HelloWorld工程_c++_13


QT Creator快速入门读书笔记:新建HelloWorld工程_qt_14

使用.ui文件

在模板中选择Qt中的Qt Designer Form,在选择界面模板时选择Dialog without Buttons项,单击下一步,将文件名称改为hellodialog.ui。ui文件其实是XML文件,里面是界面部件的相关信息。

QT Creator快速入门读书笔记:新建HelloWorld工程_qt_15


由ui文件生成的ui_hellodialog.h头文件,下面是具体内容。是由Qt用户界面编译器5.9.9生成的代码,并且手动对该文件改动,再次编译ui文件时会丢失。

QT Creator快速入门读书笔记:新建HelloWorld工程_qt_16


setupUi()函数用来生成界面,因为当时选择模板时使用的是对话框,所以现在这个函数的参数是QDialog类型的。第29行和30行设置了对话框的对象名称。第31行设置了窗口的带下。第32-34行在对话框上创建了标签对象,并设置了它的对象名称、大小和位置。第36行调用了retranslateUi()函数,这个函数在第41-45行进行了定义,实现了对窗口里的字符串进行编码转换的功能。第38行调用了QMetaObject类的connectSlotsByName()静态函数,使得窗口中的部件可以实现按对象名进行信号和槽的关联。

QT Creator快速入门读书笔记:新建HelloWorld工程_布局管理器_17


这里的HelloDialog是ui_hellodialog.h头文件中定义的继承自Ui_HelloworldDialog的类。

QT Creator快速入门读书笔记:新建HelloWorld工程_qt_18

布局管理器

Qt主要提供QLayout类及其子类作为布局管理器,它们可以实现常用的布局管理功能。Qt的布局管理关系提供了强大的机制来自动排列窗口中的所有部件,确保它们有效地使用空间。

所有QWidget的子类的实例(对象)都可以使用布局管理器管理位于它们之中的子部件,QWidget::setLayout()函数可以在一个部件上应用布局管理器。一旦一个部件上设置了布局管理器,那么它会完成以下几种任务:定位子部件;感知窗口默认大小;感知窗口最小大小;窗口大小变化时进行处理;当内容改变时自动更新(字体大小、文本或子部件的其他内容随之改变,隐藏或显示子部件,溢出一个子部件)

QT Creator快速入门读书笔记:新建HelloWorld工程_qt_19


QLayout类是布局管理器的基类,是一个抽象基类,继承自QObject和QLayoutItem类,QLayoutItem类提供了一个供QLayout操作的抽象项目。QLayout和QLayoutItem都是都是在设计自己的布局管理器时才使用的,一般只需要使用QLayout的几个子类即可。它们分别是QBoxLayout(基本布局管理器)、QGridLayout(栅格布局管理器)、QFormLayout(窗体布局管理器)和QStackedLayout(栈布局管理器)。

基本布局管理器

基本布局管理器QBoxLayout类可以使子部件在水平方向或者垂直方向排成一列,它将所有的空间分成一行盒子,然后将每个部件放入一个盒子中。它有两个子类QHBoxLayout水平布局管理器和QVBoxLayout垂直布局管理器。

栅格布局管理器

栅格布局管理器QGridLayout类使部件在网格中进行布局,它将所有的空间分隔成一些行和列,行和列的交叉处形成了单元格,然后将部件放入一个确定的单元格中。

窗体布局管理器

窗体布局管理器QFormLayout类用来管理表单的输入部件以及与它们相关的标签。窗体布局管理器将它的子部件分为两列,左边是一些标签,右边是一些输入部件,比如行编辑器或者数字选择框等。

QT Creator快速入门读书笔记:新建HelloWorld工程
​QT Creator快速入门读书笔记:窗口部件初探