2026/2/8 10:29:24
网站建设
项目流程
东莞企业网站建设营销,四川省工程建设信息官方网站,网站改版升级总结,网站推广好不好目录
1、Qt 主要版本发展历程
2、各版本详细对比表
3、底层库对比
4、Qt基类
5、举例
6、QApplication与窗口关联 1、Qt 主要版本发展历程 版本 发布年份 主要特点 当前状态 Qt 1 1995 第一个公开版本#xff0c;仅支持 Unix/X11 已淘汰 Qt 2 1999 引入信号槽…目录1、Qt 主要版本发展历程2、各版本详细对比表3、底层库对比4、Qt基类5、举例6、QApplication与窗口关联1、Qt 主要版本发展历程版本发布年份主要特点当前状态Qt 11995第一个公开版本仅支持 Unix/X11已淘汰Qt 21999引入信号槽机制支持 Windows已淘汰Qt 32001引入 Qt Designer模块化设计已淘汰Qt 42005完全重写LGPL 授权跨平台成熟维护到 2015年Qt 52012QML/Qt Quick 为核心移动端支持维护到 2025年5月Qt 62020现代化架构C173D 集成当前主版本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 4Qt 5Qt 6C 标准C98C11C17GUI 架构QWidget 为主QWidget Qt QuickQt Quick 为主移动平台不支持完整支持优化支持3D 支持有限Qt 3D 模块集成 Qt 3DWeb 渲染QtWebKitQt WebEngineQt WebEngine构建系统qmake 为主qmake CMakeCMake 为主Python 绑定PyQt4PyQt5/PySide2PyQt6/PySide6最小内存~8-12 MB~15-25 MB~20-30 MB发布大小~50-100 MB~200-300 MB~300-500 MB模块数量~20~50~60Qt Quick 本质是 C 库所有 QML 最终都被编译/解释为 C 调用完全可以用纯 C 开发但代码会冗长失去 QML 的声明式优势最佳实践是混合使用界面布局、样式、简单交互 → QML快速开发业务逻辑、数据处理、高性能组件 → C性能、复用Qt Quick 不是只能写 QMLQML 只是 Qt Quick 的一种使用方式不是唯一方式C 提供最大控制和性能对于专业应用C 是必不可少的3、底层库对比层次QWidget 使用Qt Quick 使用差异影响语言CQML JavaScript CQML 用于 UI逻辑可用 C/JS渲染后端QPainter (软件/CPU)Scene Graph (GPU)性能差距巨大图形 API可选的 OpenGL/DirectX强制 GPU 加速Qt Quick 必须硬件加速动画引擎QVariantAnimation 等内置的动画系统集成度不同事件循环主线程事件循环多线程渲染Qt Quick 不阻塞 UI4、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(); // 没有窗口了退出应用}}}