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):
变量 | 含义 |
---|---|
QT | Qt模块列表,在用到某些模块时需要手动添加 |
CONFIG | 通用配置选项 |
DEFINES | 预处理定义列表 |
TEMPLATE | 模板,是app(应用程序)还是lib(库),默认为app |
HEADERS | 头文件列表 |
SOURCES | 源程序文件列表 |
FORMS | UI文件列表 |
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/Source | F4 | 在同名的头文件和源程序文件之间切换 |
Follow Symbol Under Cursor | F2 | 变量:跳转到声明;函数:声明和定义之间切换 |
Refactor/Rename Symbol Under Cursor | Ctrl + Shift + R | 改名称,将替换所有用到这个符号的地方 |
Refactor/Add Definition in .cpp | 为函数原型在cpp文件中生成函数体 | |
Auto-indent Selection | Ctrl+I | 为选择的文字自动进行缩进 |
Toggle Comment Selection | Ctrl+/ | 注释或取消注释 |
Context Help | F1 | 为光标所在的符号显示帮助 |
Save All | Ctrl+Shift+S | 保存全部文件 |
Find/Replace | Ctrl+F | 调出查找/替换对话框 |
Find Next | F3 | 查找下一个 |
Build | Ctrl+B | 编译当前项目 |
Start Debugging | F5 | 开始调试 |
Step over | F10 | 单步(略过)调试,执行当前程序语句 |
Step Into | F11 | 单步(跟踪)调试,如果当前行里有函数,就跟踪进入函数 |
Toggle Breakpoint | F9 | 设置或取消当前行的断点 |
项目管理
- Build:以增量方式构建项目
- Rebuild:重新构建项目
- Clean:清除项目构建过程中产生的所有中间文件
- Run qmake/cmake:使用qmake/cmake重新构建项目,会重新执行UIC、MOC、RCC等预编译器