【UI Qt】入门笔记
Qt Quick 不是只能写 QML:QML 只是 Qt Quick 的一种使用方式,不是唯一方式。Qt Quick 本质是 C++ 库:所有 QML 最终都被编译/解释为 C++ 调用。// 调用 QWidget::create()// 没有窗口了,退出应用。// 获取并分发事件到该窗口。// 3. Qt 内部将该窗口添加到窗口列表中。// MainWindow 构造函数内部(简化表示)// 2
目录
1、Qt 主要版本发展历程
|
版本 |
发布年份 |
主要特点 |
当前状态 |
|---|---|---|---|
|
Qt 1 |
1995 |
第一个公开版本,仅支持 Unix/X11 |
已淘汰 |
|
Qt 2 |
1999 |
引入信号槽机制,支持 Windows |
已淘汰 |
|
Qt 3 |
2001 |
引入 Qt Designer,模块化设计 |
已淘汰 |
|
Qt 4 |
2005 |
完全重写,LGPL 授权,跨平台成熟 |
维护到 2015年 |
|
Qt 5 |
2012 |
QML/Qt Quick 为核心,移动端支持 |
维护到 2025年5月 |
|
Qt 6 |
2020 |
现代化架构,C++17,3D 集成 |
当前主版本 |
|
Qt 7 |
预计 2025+ |
预计下一代版本 |
开发中 |
├── 4.8/ # Qt 4.8.7 最后版本
├── 5.15/ # Qt 5.15 LTS
├── 6.5/ # Qt 6.5 LTS
└── 6.7/ # 最新稳定版
2、各版本详细对比表
|
特性 |
Qt 4 |
Qt 5 |
Qt 6 |
|---|---|---|---|
|
C++ 标准 |
C++98 |
C++11 |
C++17 |
|
GUI 架构 |
QWidget 为主 |
QWidget + Qt Quick |
Qt Quick 为主 |
|
移动平台 |
不支持 |
完整支持 |
优化支持 |
|
3D 支持 |
有限 |
Qt 3D 模块 |
集成 Qt 3D |
|
Web 渲染 |
QtWebKit |
Qt WebEngine |
Qt WebEngine |
|
构建系统 |
qmake 为主 |
qmake + CMake |
CMake 为主 |
|
Python 绑定 |
PyQt4 |
PyQt5/PySide2 |
PyQt6/PySide6 |
|
最小内存 |
~8-12 MB |
~15-25 MB |
~20-30 MB |
|
发布大小 |
~50-100 MB |
~200-300 MB |
~300-500 MB |
|
模块数量 |
~20 |
~50+ |
~60+ |
Qt Quick 本质是 C++ 库:所有 QML 最终都被编译/解释为 C++ 调用
完全可以用纯 C++ 开发:但代码会冗长,失去 QML 的声明式优势
最佳实践是混合使用:
界面布局、样式、简单交互 → QML(快速开发)
业务逻辑、数据处理、高性能组件 → C++(性能、复用)
Qt Quick 不是只能写 QML:QML 只是 Qt Quick 的一种使用方式,不是唯一方式
C++ 提供最大控制和性能:对于专业应用,C++ 是必不可少的
3、底层库对比
|
层次 |
QWidget 使用 |
Qt Quick 使用 |
差异影响 |
|---|---|---|---|
|
语言 |
C++ |
QML + JavaScript + C++ |
QML 用于 UI,逻辑可用 C++/JS |
|
渲染后端 |
QPainter (软件/CPU) |
Scene Graph (GPU) |
性能差距巨大 |
|
图形 API |
可选的 OpenGL/DirectX |
强制 GPU 加速 |
Qt Quick 必须硬件加速 |
|
动画引擎 |
QVariantAnimation 等 |
内置的动画系统 |
集成度不同 |
|
事件循环 |
主线程事件循环 |
多线程渲染 |
Qt Quick 不阻塞 UI |
4、Qt基类
Qt 是一个庞大的框架,包含许多基类。以下是一些最重要的基类及其作用:
-
QObject
作用:Qt 对象模型的基类,提供了信号与槽机制、事件处理、对象树管理、动态属性、元对象系统等核心功能。重要性:几乎所有的 Qt 类都直接或间接继承自 QObject,它是 Qt 框架的基石。 -
QWidget
作用:所有用户界面界面元素的基类,用于创建窗口和控件。它继承自 QObject 和 QPaintDevice,提供了绘制、事件处理、布局、样式等 GUI 相关功能。重要性:所有窗口部件(按钮、标签、对话框等)都直接或间接继承自 QWidget。 -
QPaintDevice
作用:可以用 QPainter 绘制的对象的抽象基类。例如,QWidget、QImage、QPixmap、QOpenGLPaintDevice 等都是 QPaintDevice 的子类。重要性:提供了 Qt 绘图系统的基础。 -
QWindow
作用:表示底层窗口的类,继承自 QObject 和 QSurface。它提供了与平台无关的窗口表示,通常用于在不需要控件(QWidget)的情况下直接管理窗口。重要性:是 QWidget 的底层基础,也可用于纯 OpenGL 渲染。 -
QEvent
作用:所有事件类的基类。Qt 的事件系统用于处理用户输入、定时器、窗口系统事件等。重要性:事件处理是 Qt 应用程序响应用户操作和系统事件的核心机制。 -
QCoreApplication / QGuiApplication / QApplication
作用:应用程序类,分别用于非 GUI 应用、基于窗口的 GUI 应用和基于控件(Widget)的 GUI 应用。它们管理应用程序的生命周期、事件循环、命令行参数等。重要性:每个 Qt 应用程序都必须有一个应用程序对象,它是事件循环的起点。 -
QThread
作用:线程类,用于多线程编程。它提供了创建、启动、管理和同步线程的方法。重要性:使得在 Qt 中进行并发编程成为可能。 -
QIODevice
作用:所有输入输出设备的基类,例如 QFile、QTcpSocket、QSerialPort 等都继承自 QIODevice。它提供了读写数据的统一接口。重要性:Qt 中所有数据读写操作的基础。 -
QAbstractItemModel
作用:模型/视图架构中模型类的基类,用于为数据项提供标准的接口。它使得数据可以以各种形式(列表、表格、树)显示在视图(如 QListView、QTableView、QTreeView)中。重要性:模型/视图架构的核心,实现了数据与显示的分离。 -
QAbstractButton
作用:所有按钮控件的基类,例如 QPushButton、QCheckBox、QRadioButton 都继承自它。它提供了按钮的通用功能,如点击、选中状态等。重要性:统一了按钮类控件的行为。 -
QMainWindow
作用:主窗口类,提供了菜单栏、工具栏、状态栏、停靠窗口等标准主窗口组件的框架。重要性:用于创建应用程序的主窗口。 -
QDialog
作用:对话框窗口的基类,用于创建模态或非模态对话框。重要性:对话框是 GUI 应用程序中常用的组件。 -
QLayout
作用:布局管理器的基类,用于自动排列子控件。例如,QHBoxLayout、QVBoxLayout、QGridLayout 等。重要性:使得控件可以自动排列,适应窗口大小变化。 -
QGraphicsItem
作用:图形视图框架中所有图形项的基类,用于创建自定义的图形项,可以在 QGraphicsScene 中显示。重要性:图形视图框架的核心,用于创建复杂的交互式图形界面。 -
QQuickItem
作用:Qt Quick 2 中所有可视元素的基类,类似于 QWidget 在 Qt Widgets 中的地位,但用于 QML 场景。重要性:Qt Quick 应用程序的构建块。
5、举例
使用QWidget实现一个移动动画:
#include <QApplication>
#include <QWidget>
#include <QPropertyAnimation>
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent = nullptr) : QWidget(parent)
{
setFixedSize(100, 100);
}
protected:
void paintEvent(QPaintEvent *event) override
{
QPainter painter(this);
painter.fillRect(rect(), Qt::blue);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyWidget widget;
widget.show();
// 创建一个动画,将widget从(0,0)移动到(200,200)
QPropertyAnimation animation(&widget, "pos");
animation.setDuration(2000);
animation.setStartValue(QPoint(0, 0));
animation.setEndValue(QPoint(200, 200));
animation.start();
return app.exec();
}
使用Qt Quick QML实现同样的动画:
import QtQuick 2.15
import QtQuick.Window 2.15
Window {
width: 640
height: 480
visible: true
Rectangle {
id: rect
width: 100
height: 100
color: "blue"
// 使用动画
NumberAnimation on x {
from: 0
to: 200
duration: 2000
}
NumberAnimation on y {
from: 0
to: 200
duration: 2000
}
}
}
6、QApplication与窗口关联
// MainWindow 构造函数内部(简化表示)
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// 1. 创建窗口句柄
create(); // 调用 QWidget::create()
// 2. 注册到平台窗口系统
// Windows: CreateWindowEx()
// macOS: [NSWindow alloc] init]
// Linux/X11: XCreateWindow()
// 3. Qt 内部将该窗口添加到窗口列表中
QApplicationPrivate::addWidget(this);
}
int QApplication::exec()
{
// 伪代码:事件循环处理窗口关联
while (!quit) {
// 1. 获取所有顶层窗口
QWidgetList windows = QApplication::topLevelWidgets();
// 2. 处理每个窗口的事件
foreach (QWidget *window, windows) {
if (window->isVisible()) {
// 获取并分发事件到该窗口
QWindowSystemInterface::handleEvent(window, event);
}
}
// 3. 检查窗口状态
if (windows.empty()) {
quit(); // 没有窗口了,退出应用
}
}
}
7、信号与槽
QObject::connect() -> QMetaObjectPrivate::connect()
编译流程:
原始 C++ 代码 (MyObject.h)
↓
MOC 预处理 → 生成 moc_MyObject.cpp
↓
正常的 C++ 编译器
↓
最终可执行文件
更多推荐

所有评论(0)