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

}

}

}

相关推荐
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz8 天前
QML Hello World 入门示例
qt
xcyxiner11 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner12 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner12 天前
DicomViewer (添加模型类)3
qt
xcyxiner13 天前
DicomViewer (目录调整) 2
qt
xcyxiner13 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00615 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术15 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript