Post

Qt学习第二章——GUI程序结构与运行机制

GUI程序结构与运行机制

新建一个Widget Application项目:QWidget作窗口基类,选中Generate form复选框

sampl_2_1.pro:qmake构建系统的项目配置文件,存储了各种项目设置。 main.cpp:主程序入口文件,实现main函数 widget.ui: 使用XML格式描述元件及布局的界面文件 widget.h:窗口类定义头文件,用到了.ui文件 widget.cpp:是实现文件

.pro 项目管理文件

1
2
3
4
5
6
7
8
9
10
11
12
QT       += core gui // 导入模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++17
SOURCES += main.cpp \
  					widget.cpp
  
HEADERS += widget.h
FROMS += widget.ui
# Default rules for development
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

qmake配置文件中常见变量的含义(更多内容参见qmake Manual):

变量含义
QTQt模块列表,在用到某些模块时需要手动添加
CONFIG通用配置选项
DEFINES预处理定义列表
TEMPLATE模板,是app(应用程序)还是lib(库),默认为app
HEADERS头文件列表
SOURCES源程序文件列表
FORMSUI文件列表
RESOURCES资源文件(.qrc)列表
TARGET生成的可执行文件名称,默认与项目同名
DESTDIR可执行文件的存放路径
INCLUDEPATH文件搜索路径列表
DEPENDPATH其他依赖文件的搜索路径列表
INSTALLS创建指向目录的符号链接
  • qmake是构建项目的软件,它根据.prc文件生成Makefile文 件,然后C++编译器可以根据Makefile文件进行编译和链接
  • qmake还会自动生成 MOC(meta-object compiler)和 UIC(user interface compiler)生成构建规则
  • $$为替换函数的前缀

可视化 UI 设计

添加资源文件(.qrc)

File>New File>Qt>Qt Resource File

使用Add Prefix创建文件名,使用Add Files添加文件

此时,在.pro文件下出现以下代码

1
2
RESOURCES += \
res.qrc

替换icon:

1
2
3
RESOURCES += \
res.qrc	//res为文件名,qrc为扩展名
RE_ICONS=editor.ico

信号与槽简介

信号与槽是Qt编程的基础,也是Qt的一大创新,它使得Qt中的组件交互变得直观简单

1
QObject::connect(sender,SIGNAL(signal()),receiver,SLOT(slot());

signal()可以只声明不定义,slot()必须定义

上面是信号槽多种实现方式中的一种,connect是QObject类中的静态成员函数(使用时 QObject通常可以省略. SIGNAL和SLOT是Qt的宏,用于将参数转换为相应的字符串。下面是一些注意事项:

  • 一个信号可以连接多个槽函数
  • 多个信号可以可以连接同一个参函数
  • 一个信号可以连接另一个信号

QT还支持通过函数名称将信号和槽关联,需要首先开启该功能:

1
QMetaObject::connectSlotByName(Dialog);

函数名称为:void on_sobject name>_<signal name>(<signal parameters>)

例如void on_chkBoxUnder_clicked(bool checked);void on_btnclear_clicked();

可视化 UI 设计代码实现

代码

见GitHub仓库

注意事项

  • 新建一个Widget Application项目:QDialog作为窗口基类

  • 对于功能为“清空”的 pushButton 需要右键转到槽,添加ui->plainTextEdit->clear()

  • “更改字体”功能使用了复选框,右键添加事件时选择clicked(bool)

  • 更改字体方法:

1
2
3
4
5
6
void Dialog::on_checkBox_underline_clicked(bool checked)
{
	QFont font = ui->plainTextEdit->font();
	font.setUnderline(checked);
	ui->plainTextEdit->setFont(font);
}	//以添加下划线为例,其余同理
  • 更改颜色的思路是三个单选按钮连到同一个槽函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Dialog::do_FontColor() 
{
	QPalette palette = ui->plainTextEdit->palette();
	if(ui->radioButton_black->isChecked())
	{
		palette.setColor(QPalette::Text, Qt::black)
	}
	if(ui->radioButton_red->isChecked())
	{
		palette.setColor(QPalette::Text, Qt:red)
	}
	if(ui->radioButton_blue->isChecked())
	{
		palette.setColor(QPalette::Text, Qt::blue)
	}
	ui->plainTextEdit->setPalette(palette);
}
  • 更改颜色函数定义完需要在dialog.cpp建立链接
1
2
3
4
5
6
7
8
9
Dialog::Dialog(QWidget *parent)
	: QDialog(parent)
	, ui(new Ui::Dialog)
{
	ui->setupUi(this);
+	connect(ui->radioButton_black, SIGNAL(clicked()), this, SLOT(do_FontColor()));
+	connect(ui->radioButton_red, SIGNAL(clicked()), this, SLOT(do_FontColor()));
+	connect(ui->radioButton_blue, SIGNAL(clicked()), this, SLOT(do_FontColor()));
}	

代码 UI 设计布局实现

  • 为什么使用纯代码方式?
  • 更灵活,可以完成很多可视化 UI 设计无法完成的工作。

新建一个Widget Application项目:QDialog作为窗口基类,不勾选 “Generate form”

这样会导致不会生成 ui 文件、ui_xxx.h 文件、类中没有定义指向界面的指针 ui

代码

见GitHub仓库

注意事项

  • 由于要自己添加UI组件,所以要在dialog.cpp文件中声明头文件,要在dialog.h中声明类名用于定义指针
1
2
3
4
5
6
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QPlainTextEdit>
#include <QRadioButton>
#include <QCheckBox>
1
2
3
4
class QCheckBox;
class QRadioButton;
class QPushButton;
class QPlainTextEdit;
  • 在构造函数中实现UI组件
  • 将组件添加到布局要用Hlayout1->addWidget(checkBoxUnderline);,将布局添加到布局要用Vlayout->addLayout(Hlayout1);
  • 添加完所有组件后要用setLayout(Vlayout);来让布局展示在对话框中

代码UI设计信号槽连接

代码

见GitHub仓库

注意事项

  • 添加槽函数声明时要在头文件中private slots:下声明

使用 CMake 创建项目

CMake是一个功能强大的跨平台的构建工具,它通过与平台和编译器无关的配置文件控制软件的构建过程,生成本地化的makefile文件或IDE项目。很多大型的开源软件都使用CMake构建系统,Qt 6本身就是用CMake构建的。

CMakeLists.txt 主文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cmake_minimum_required(VERSION 3.5) //最低版本要求

project(sample2_4 VERSION 0.1 LANGUAGES CXX) // 项目名称、版本、语言

// 开启三个compiler
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)

// 会自动载入
set(PROJECT_SOURCES
			main.cpp
			dialog.cpp
			dialog.h
			dialog.ui
)

Qt Creator 使用技巧

Qt Creator 的一些快捷操作

功能快捷键解释
Switch Header/SourceF4在同名的头文件和源程序文件之间切换
Follow Symbol Under CursorF2变量:跳转到声明;函数:声明和定义之间切换
Refactor/Rename Symbol Under CursorCtrl + Shift + R改名称,将替换所有用到这个符号的地方
Refactor/Add Definition in .cpp 为函数原型在cpp文件中生成函数体
Auto-indent SelectionCtrl+I为选择的文字自动进行缩进
Toggle Comment SelectionCtrl+/注释或取消注释
Context HelpF1为光标所在的符号显示帮助
Save AllCtrl+Shift+S保存全部文件
Find/ReplaceCtrl+F调出查找/替换对话框
Find NextF3查找下一个
BuildCtrl+B编译当前项目
Start DebuggingF5开始调试
Step overF10单步(略过)调试,执行当前程序语句
Step IntoF11单步(跟踪)调试,如果当前行里有函数,就跟踪进入函数
Toggle BreakpointF9设置或取消当前行的断点

项目管理

  • Build:以增量方式构建项目
  • Rebuild:重新构建项目
  • Clean:清除项目构建过程中产生的所有中间文件
  • Run qmake/cmake:使用qmake/cmake重新构建项目,会重新执行UIC、MOC、RCC等预编译器
This post is licensed under CC BY 4.0 by the author.