【UI Qt】入门笔记

目录

[1、Qt 主要版本发展历程](#1、Qt 主要版本发展历程)

2、各版本详细对比表

3、底层库对比

4、Qt基类

5、举例

6、QApplication与窗口关联


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 是一个庞大的框架,包含许多基类。以下是一些最重要的基类及其作用:

  1. QObject

    作用:Qt 对象模型的基类,提供了信号与槽机制、事件处理、对象树管理、动态属性、元对象系统等核心功能。重要性:几乎所有的 Qt 类都直接或间接继承自 QObject,它是 Qt 框架的基石。

  2. QWidget

    作用:所有用户界面界面元素的基类,用于创建窗口和控件。它继承自 QObject 和 QPaintDevice,提供了绘制、事件处理、布局、样式等 GUI 相关功能。重要性:所有窗口部件(按钮、标签、对话框等)都直接或间接继承自 QWidget。

  3. QPaintDevice

    作用:可以用 QPainter 绘制的对象的抽象基类。例如,QWidget、QImage、QPixmap、QOpenGLPaintDevice 等都是 QPaintDevice 的子类。重要性:提供了 Qt 绘图系统的基础。

  4. QWindow

    作用:表示底层窗口的类,继承自 QObject 和 QSurface。它提供了与平台无关的窗口表示,通常用于在不需要控件(QWidget)的情况下直接管理窗口。重要性:是 QWidget 的底层基础,也可用于纯 OpenGL 渲染。

  5. QEvent

    作用:所有事件类的基类。Qt 的事件系统用于处理用户输入、定时器、窗口系统事件等。重要性:事件处理是 Qt 应用程序响应用户操作和系统事件的核心机制。

  6. QCoreApplication / QGuiApplication / QApplication

    作用:应用程序类,分别用于非 GUI 应用、基于窗口的 GUI 应用和基于控件(Widget)的 GUI 应用。它们管理应用程序的生命周期、事件循环、命令行参数等。重要性:每个 Qt 应用程序都必须有一个应用程序对象,它是事件循环的起点。

  7. QThread

    作用:线程类,用于多线程编程。它提供了创建、启动、管理和同步线程的方法。重要性:使得在 Qt 中进行并发编程成为可能。

  8. QIODevice

    作用:所有输入输出设备的基类,例如 QFile、QTcpSocket、QSerialPort 等都继承自 QIODevice。它提供了读写数据的统一接口。重要性:Qt 中所有数据读写操作的基础。

  9. QAbstractItemModel

    作用:模型/视图架构中模型类的基类,用于为数据项提供标准的接口。它使得数据可以以各种形式(列表、表格、树)显示在视图(如 QListView、QTableView、QTreeView)中。重要性:模型/视图架构的核心,实现了数据与显示的分离。

  10. QAbstractButton

    作用:所有按钮控件的基类,例如 QPushButton、QCheckBox、QRadioButton 都继承自它。它提供了按钮的通用功能,如点击、选中状态等。重要性:统一了按钮类控件的行为。

  11. QMainWindow

    作用:主窗口类,提供了菜单栏、工具栏、状态栏、停靠窗口等标准主窗口组件的框架。重要性:用于创建应用程序的主窗口。

  12. QDialog

    作用:对话框窗口的基类,用于创建模态或非模态对话框。重要性:对话框是 GUI 应用程序中常用的组件。

  13. QLayout

    作用:布局管理器的基类,用于自动排列子控件。例如,QHBoxLayout、QVBoxLayout、QGridLayout 等。重要性:使得控件可以自动排列,适应窗口大小变化。

  14. QGraphicsItem

    作用:图形视图框架中所有图形项的基类,用于创建自定义的图形项,可以在 QGraphicsScene 中显示。重要性:图形视图框架的核心,用于创建复杂的交互式图形界面。

  15. 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(); // 没有窗口了,退出应用

}

}

}

相关推荐
Salt_07282 小时前
DAY32 类的定义和方法
开发语言·python·算法·机器学习
未来影子2 小时前
Java领域构建Agent新杀入一匹黑马(agentscope-java)
java·开发语言·python
不会写DN2 小时前
JavaScript call、apply、bind 方法解析
开发语言·前端·javascript·node.js
阿里嘎多学长2 小时前
2025-12-12 GitHub 热点项目精选
开发语言·程序员·github·代码托管
goxingman2 小时前
实体类上关于时间字符串和时间字段转换涉及注解分析
java·开发语言
_Voosk2 小时前
C指针存储字符串为何不能修改内容
c语言·开发语言·汇编·c++·蓝桥杯·操作系统
mengzhi啊2 小时前
qt自绘制,蜂巢网格,感觉没什么用
qt
吃不饱的得可可2 小时前
【Linux】mmap文件映射的使用
linux·开发语言·c++
管理大亨2 小时前
ELK的操作应用
开发语言·python·elk