Qt6 C++ 开发指南学习记录二
二、GUI程序设计基础
2.1 GUI程序结构与运行机制
2.1.1 GUI项目文件组成
在Qt Creator
中新建一个项目HelloWorld
,这个项目目录树如下
HelloWorld.pro
文件:使用qmake
构建系统时的项目配置文件,包括关于项目的各种设置内容。Headers
文件夹:该节点下是项目内的C++
头文件(.h
文件),该项目有一个头文件widget.h
,它是窗口类的头文件。Sources
文件夹:该节点下是项目内的C++
源程序文件(.cpp
文件),该项目有两个C++
源程序文件:widget.cpp
是窗口类的程序文件,与widget.h
文件对应;main.cpp
是包含main()
函数的文件。Forms
文件夹:该节点下是项目内的窗体文件(.ui
文件),也称为用户界面(user interface
,UI
)文件。该项目有一个UI
文件widget.ui
。
2.1.2 项目配置文件
使用向导创建项目,选择qmake
构建系统会生成一个“.pro”
的项目配置文件,文件名称就是项目名称。文件HelloWorld.pro
是本项目的项目配置及文件:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++17
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp \
widget.cpp
HEADERS += \
widget.h
FORMS += \
widget.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${
TARGET}/bin
else: unix:!android: target.path = /opt/$${
TARGET}/bin
!isEmpty(target.path): INSTALLS += target
qmake
是构建项目的工具软件,qmake
的作用是根据项目配置文件中的设置生成Makefile
文件,然后C++
编译器就可以根据Makefile
文件进行编译和连接。对于Qt
项目,qmake
还会自动为元对象编译器(meta-object compiler
,MOC
)和用户界面编译器(user interface compiler
,UIC
)生成构建规则。
Qt
项目的配置文件是自动生成的,一般不需要手动修改。配置文件中“#”
用于标识注释语句。
qmake
配置文件中常见变量的含义见下表:
变量和 | 含义 |
---|---|
QT | 项目中使用的Qt模块列表,在用到某些模块时需要手动添加 |
CONFIG | 项目的通用配置选项 |
DEFINES | 项目中的预处理定义列表,例如可以定义一些用于预处理的宏 |
TEMPLATE | 项目使用的模板,项目模板可以是应用程序(app)或库(lib)。如果不设置就默认为应用程序 |
HEADERS | 项目中的头文件(.h文件)列表 |
SOURCES | 项目中的源程序文件(.cpp文件)列表 |
FORMS | 项目中的UI文件(.ui文件)列表 |
RESOURCES | 项目中的资源文件(.qrc文件)列表 |
TARGET | 项目构建后生成的应用程序的可执行文件名称,默认与项目名称相同 |
DESTDIR | 目标可执行文件的存放路径 |
INCLUDEPATH | 项目用到的其他头文件的搜索路径列表 |
DEPENDPATH | 项目其他依赖文件(如源程序文件)的搜索路径列表 |
qmake
中提供替换函数(replace function
)用于在配置过程中处理变量或内置函数的值,“$$”
是替换函数的前缀,后面可以是变量名或qmake
的一些内置函数。
2.1.3 UI文件
后缀为ui
的文件是用于窗口界面可视化设计的文件,如widget.ui
。双击项目管理目录树中的文件widget.ui
,Qt Creator
会打开内置的Qt Designer
对窗口界面进行可视化设计。
Qt Designer
有以下一些功能区域。
- 窗口左侧是组件面板,分为多个组,如Layouts、Buttons、Display Widgets等,界面设计的常用组件都可以在组件面板里找到。
- 窗口中间主要区域是待设计的窗体。如果要将某个组件放置到窗体上,从组件面板上拖动一个组件放置到窗体上即可。例如,放置一个标签(Label)和一个按钮(Push Button)到窗体上。
- 待设计窗体下方有Action编辑器(Action Editor)和信号与槽编辑器(Signals and Slots Editor)。Action编辑器用于可视化设计Action,信号与槽编辑器用于可视化地进行信号与槽的关联。
- 窗口上方有一个布局和界面设计工具栏,工具栏上的按钮主要用于实现布局和界面设计。
- 窗口右侧上方是对象检查器(Object Inspector),它用树状视图显示窗体上各组件的布局和层级关系。视图有两列,显示了每个组件的对象名称(objectName)和类名称。
- 窗口右侧下方是属性编辑器(Property Editor)。属性编辑器显示窗体上选中的组件或窗体的各种属性,可以在属性编辑器里修改这些属性的值。
属性编辑器的内容分为两列,Property
列是属性的名称,Value
列是属性的值。属性又分为多个组,实际上表示类的继承关系。objectName
属性表示组件的对象名称,每个组件都需要一个唯一的对象名称,以便在程序中被引用。组件的命名应该遵循一定的规则,具体使用什么样的命名规则根据个人习惯而定,主要是要便于区分和记忆,也要便于与普通变量区分。在属性编辑器里可以修改组件的属性值。
2.1.4 主程序文件
文件main.cpp
中包含main()
函数,全部代码如下:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv); // 定义并创建应用程序
Widget w; // 定义并创建窗口对象
w.show(); // 显示窗口
return a.exec(); // 运行应用程序,开始应用程序的消息循环和事件处理
}
main()
函数是C++
程序的入口。
QApplication
是Qt
的标准应用程序类。
2.1.5 窗口相关的文件
Qt Creator
的Projects
设置界面,取消勾选Shadow build
复选框,然后以Release
模式构建项目。构建项目后,项目的根目录下会生成一个文件ui_widget.h
。
窗口相关的几个文件:
文件 | 说明 |
---|---|
widget.h | 定义了窗口类Widget |
widget.cpp | 实现Widget类的功能的源程序文件 |
widget.ui | 窗口UI文件,用于在 Qt Designer中进行UI可视化设计。widget.ui是一个XML文件,存储界面上各个组件的属性和布局内容 |
ui_widget.h | UI文件经过UIC编译后生成的文件,这个文件里定义了一个类,类的名称是Ui_Widget,用C++语言描述UI文件中界面组件的属性设置、布局以及信号与槽的关联等内容 |
1、文件widget.h
文件widget.h
是定义窗口类的头文件。文件内容如下:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget; } // 一个名字控件Ui,包含一个类Widget
QT_END_NAMESPACE
class Widget : public QWidget // 类Widget继承自类QWidget
{
Q_OBJECT // 使用Qt元对象系统的类时必须插入的一个宏
public:
Widget(QWidget *parent = nullptr); // 构造函数
~Widget(); // 析构函数
private:
Ui::Widget *ui; // 使用Ui::Widget类定义的一个对象指针
};
#endif // WIDGET_H
2、文件widget.cpp
widget.cpp
是对应于文件widget.h
的源程序文件,内容如下:
#include "widget.h"
#include "ui_widget.h" // UI文件widget.ui被UIC编译后生成的文件,定义了窗口UI类
Widget::Widget(QWidget *parent) // 构造函数
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget() // 析构函数
{
delete ui;
}
3、文件widget.ui
文件widget.ui
是窗口界面定义文件,是一个XML
文件。它存储了界面上所有组件的属性设置、布局、信号与槽函数的关联等内容。用Qt Designer
打开UI
文件进行窗口界面可视化设计,保存修改后会重新生成UI
文件。
4、文件ui_widget.h
构建项目时,UI
文件widget.ui
会被Qt
的UIC
编译为对应的C++
语言头文件ui_widget.h
。内容如下:
/********************************************************************************
** Form generated from reading UI file 'widget.ui'
**
** Created by: Qt User Interface Compiler version 6.5.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_WIDGET_H
#define UI_WIDGET_H
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_Widget // 定义Ui_Widget类,用于封装可视化设计的界面
{
public: // 为每一个组件定义一个指针变量,变量的名称就是UI可视化设计时为组件设计的对象名称
QLabel *label;
void setupUi(QWidget *Widget) // 一个输入参数Widget,是QWidget类型的指针
{
if (Widget->objectName().isEmpty())
Widget->setObjectName("Widget");
Widget->resize(241, 146);
label = new QLabel(Widget);
label->setObjectName("label"); // 将Widget作为label的父容器
label->setGeometry(QRect(60, 40, 131, 61));
QFont font;
font.setPointSize