【C++】QT 6 简单上手

4,841 阅读9分钟

QT 6 简单上手

  • 作者: Wel2018
  • 文章状态: 更新中
  • 系列状态: 未完结
  • 阅读预计用时:10 分钟

本文概要

本文是对 QT6 的入门介绍,主要内容包括:QML、Qt Creator、Qt Design Studio、信号槽机制、字符串、反射机制、内存管理、对象树、线程、Qt Widget 等。

更新记录

  • 2022-08-09:发布

待更新:Qt 事件循环、元对象系统、反射机制、Qt ORM、SQL、序列化、缓冲机制、2D、3D 绘图、脚本、Qt 通信机制(包括 QTcpSocketQProcess、共享内存)、多线程支持等。

Qt 是一个用于开发跨平台工业级应用的 C++ 框架,主要支持桌面端、移动端(Android、iOS)、嵌入式设备等平台,由于其 API 库丰富强大、文档完备、容易使用的优点被广泛用于大型项目的开发,当前最新版本为 6.3.1(于 2022 年 6 月 14 日发布)。wiki 介绍如下:

是一个跨平台的 C++ 应用程序开发框架。广泛用于开发 GUI 程序,这种情况下又被称为部件工具箱。也可用于开发非 GUI 程序,例如控制台工具和服务器。Qt 被用于 OPIE、Skype、VLC media player、Adobe Photoshop Elements、VirtualBox 与 Mathematica 以及被 Autodesk、欧洲空间局、梦工厂、Google、HP、KDE、卢卡斯影业、西门子公司、沃尔沃集团,华特迪士尼动画制作公司、三星集团、飞利浦、Panasonic 所使用。它是 Digia 公司的产品。Qt 使用标准的 C++ 和特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏。通过语言绑定,其他的编程语言也可以使用 Qt 1

我用过的一些基于 Qt 开发的知名软件有 WPS Office、VirtualBox、优酷客户端、Snipaste、Autodesk Maya、Google Earth 等 2

Qt 与相似技术的对比:

QtMFCWinformWPFElectron
界面样式QWidgets / QML自带设计器自带设计器XAMLCSS
编程语言C++C++C#C#JS(TS)
跨平台

Qt 框架主要包含如下内容:

快速上手

一个简单的控制台程序如下:

#include <QCoreApplication>
int main(int argc, char *argv[])
{
    // 创建核心应用类
    QCoreApplication a(argc, argv);
    puts("Hello World QT 6");
    return a.exec();
}

cmake 构建脚本:

cmake_minimum_required(VERSION 3.14)
project(learn-qt-in-console LANGUAGES CXX)

# 将当前位置加入包含目录中
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# 启用Qt的底层依赖
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

# 设置 -std=c++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 导入 Qt 的核心类库
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core)

# 创建可执行文件
add_executable(learn-qt-in-console
  main.cpp
)

target_link_libraries(learn-qt-in-console Qt${QT_VERSION_MAJOR}::Core)

install(TARGETS learn-qt-in-console
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

输出:

正在启动 "C:\Qt\Tools\CMake_64\bin\cmake.exe" --build D:/Codehub/VS/build-learn-qt-in-console-Desktop_Qt_6_3_1_MinGW_64_bit-Debug --target all

[1/4 1.1/sec] Automatic MOC and UIC for target learn-qt-in-console
[2/3 0.5/sec] Building CXX object CMakeFiles/learn-qt-in-console.dir/main.cpp.obj
[3/3 0.5/sec] Linking CXX executable learn-qt-in-console.exe

开发工具

Qt Creator

官方解释:

Qt Creator provides you with tools for accomplishing your tasks throughout the whole application development life-cycle, from creating a project to deploying the application on the target platforms. Qt Creator automates some tasks, such as creating projects, by providing wizards that guide you step-by-step through the project creation process, create the necessary files, and specify settings depending on the choices you make. Also, it speeds up some tasks, such as writing code, by offering semantic highlighting, checking code syntax, code completion, refactoring actions, and other useful features.

Qt Creator 和大部分 IDE(如 VS、Clion)类似,对整个应用程序开发生命周期中的每个阶段都提供了相关支持:提供语义高亮显示、检查代码语法、代码完成、重构操作,提供对 nmake、qmake、cmake 等构建工具的支持,对调试、测试框架的支持等。

Qt Design

官方解释:

Qt Designer is a tool within Qt Creator for designing and building graphical user interfaces (GUIs) for Qt Widgets. You can compose and customize your widgets or dialogs in a visual editor, and test them using different styles and resolutions. Qt Designer is also available as a standalone tool. Both versions of Qt Designer only differ in some functionalities such as the use of resource files and how to switch in the design and edit mode. For more information, visit the Qt Designer manual.

Qt Designer 是集成在 Qt Creator 中的一个 UI 设计器,主要用于为 Qt Widgets 应用设计和构建图形用户界面,在可视化编辑器中组合和定制控件,并在不同分辨率下或采用不同样式对它们进行测试。也可以使用独立的 Qt Designer Studio 工具进行界面设计,二者的功能基本相同。

image.png

用户界面

Qt 的用户界面技术有两个:Qt QuickQt Widgets。Qt Quick 具有响应式布局的特点,非常适合移动端带有触摸交互的设备。而 Qt Widgets 一般用于创建复杂的桌面应用程序。

关于 QML 详情见 Qt6 QML BookQt Quick 6.3.1,关于 Qt Widgets 见 Qt Designer ManualQt Widgets 6.3.2

Qt 核心部件

Qt Core 模块主要包含如下内容:

  • 对象系统
  • 属性系统
  • 事件循环
  • 信号 & 槽
  • 定时器
  • 容器
  • 进程间通信
  • 线程库

QObject

标准 C++ 的对象模型运行效率高,但是对于 GUI 编程来说不够灵活,因此 Qt 使用自己的对象模型来扩展标准 C++:

上述大部分特性都是基于 Qt 的 QObject. 实现的,底层依赖于 Meta-Object Compiler (moc)

QString

QString 大部分操作和 std::string 相同,也有一些非常好用的新接口:

方法名说明
arg字符串格式化
startsWith / endsWith判断前缀后缀
isEmpty / isNull是否为空
isLower / isUpper是否全小/大写
trimmed去除首尾空格
tokenize单词切分
toXXX 3转换为其他类型
split切分
sliced切片
simplified去除转义字符

容器

Qt 有如下常用的容器,使用方法和 STL 容器类似:

ClassSummary
QList<T>最常用的容器,相当于 std::vector
QVarLengthArray<T, Prealloc>动态数组的底层 API,可以用于对速度非常苛刻的场景。
QSet<T>无重复元素的集合。
QMap<Key, T>根据键值排序的有序字典
QMultiMap<Key, T>QMap<Key, T> 的子类,支持重复键。
QHash<Key, T>通过哈希表实现的无序字典。
QMultiHash<Key, T>QHash<Key, T> 的子类,支持重复键。

Signals & Slots

信号槽机制(Signals & Slots)是 Qt 中的对象通信方式,信号(signal)的释放意味着有一个特定事件发生了,对于 Qt widgets(控件)默认有很多预置的信号,例如 Button 的 onClick。除了预置信号外,也可以向控件注册自定义信号。槽(slot)是用于响应信号的函数,我们同样可以给一个控件(或是继承自 QObject 的类)添加自定义槽来处理感兴趣的信号。Qt 对信号和槽使用特别的关键词支持,示例如下:

#include <QCoreApplication>
#include <QObject>

class Counter : public QObject
{
    Q_OBJECT
public:
    Counter() { m_value = 0; }
    int value() const { return m_value; }

// 槽
public slots:
    void setValue(int value);
// 信号	
signals:
    void valueChanged(int newValue);

private:
    int m_value;
};

void Counter::setValue(int value)
{
    if (value != m_value) {
        m_value = value;
        emit valueChanged(value); // 释放信号
    }
}

#include "main.moc" // moc 编译器自动生成的文件,必须包含

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    Counter c1, c2;

    // 建立信号和槽之间的联系
    QObject::connect(&c1, &Counter::valueChanged,
                     &c2, &Counter::setValue);

    QObject::connect(&c2, &Counter::valueChanged,
                     &c1, &Counter::setValue);
    
    // c1 修改自身会释放 valueChanged 信号,从而触发 c2 的 setValue
    c1.setValue(100); 
    printf("c1 = %d, c2 = %d\n", c1.value(), c2.value());
    // 同理
    c2.setValue(200);
    printf("c1 = %d, c2 = %d\n", c1.value(), c2.value());

    return app.exec();
}

// 输出
// c1 = 100, c2 = 100
// c1 = 200, c2 = 200

Qt 6 新特性

官网对 Qt 6 的定位是:

使用同一套工具设计、开发 2D 和 3D 用户界面,实现下一代用户体验。无限的可扩展性,既可在超低成本硬件上部署类似于智能手机的用户界面,也可在超级计算机上部署高级图形。Qt 6.0 是我们打造面向未来生产力平台的基石。

该版本的亮点有 4

  • Qt 渲染硬件接口:只需基于 Direct 3D、Metal、Vulkan 和 OpenGL 编写一次渲染代码,即可部署在任何硬件上
  • Qt Quick 3D:对 2D、3D 的支持整合到一个技术栈上
  • Qt Quick Controls 2 桌面样式:实现原生外观的控件
  • HiDPI 支持:针对不同的尺寸的显示器配置自动缩放
  • QProperty 系统:通过属性绑定提高对象系统的灵活性
  • 并发 API 的增强:增强多核 CPU、并行计算的表现
  • Socket 的增强:自动添加安全处理功能
  • 粒子系统 :有了它就可以像游戏引擎一样,在 Qt Quick 3D 或 Qt Design Studio 中创建火焰、爆炸等特效了
  • Qt Creator 改进:分析 C++ 和 QML 代码的测试和代码覆盖率
  • 顶点动画:使用 网格变形 模拟软材料的变形或使用 骨骼动画 抽象表示模型的运动
  • CMake 支持:对于 C++ 大型项目,CMake 几乎成为行业内大家公认的标准构建系统了,当然 Qt 仍然支持 qmake 方式。
  • 支持 C++17:更新到最新标准,提高代码的可读取性。

particles_example2_output

↑ 官方展示的粒子特效

开发环境配置

然后,使用 Qt Maintenance Tools 安装必要组件:

image.png

我还是比较习惯使用 VS,首先需要安装对应插件:Qt Visual Studio Tools

image.png

image.png

配置完成后就可以根据项目类型创建新项目了:

image.png

总结

注:待内容全部同步完成后再做总结。

鸣谢

说明

  • 【C++】系列相关博客正在更新中,感兴趣的朋友欢迎 star,您的支持是我继续更新下去的最大动力!
  • 由于本人水平、精力有限,文中可能存在疏漏之处,欢迎读者大佬们指正。
  • 对于高质量、格式规范的建议(示例:原文具体段落、修改内容、相关依据),确认无误后会合并到博客中,并将贡献者加入【鸣谢】名单中。
  • 可以随意转载,但要注明出处。

Footnotes

  1. Qt - 维基百科,自由的百科全书 (wikipedia.org)

  2. Qt开发的国内外知名软件_杨连刚的博客-CSDN博客_qt开发过什么软件

  3. 注:toXXX 有 toStdString、toStdU32String、toUInt、toFloat、toWCharArray 等。

  4. Qt 6中的新功能