news 2026/5/11 10:29:00

qt c++ 的高级绘图框架都有什么类,类的关系都是什么

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
qt c++ 的高级绘图框架都有什么类,类的关系都是什么

在 Qt C++ 中,高级绘图功能主要由Qt Graphics View Framework(图形视图框架)和Qt Paint System(绘图系统)共同支撑。它们提供了从底层像素绘制到高层场景管理的一整套机制。

下面分别介绍这两个体系中的核心类及其关系:


一、Qt Paint System(基础绘图系统)

用于直接在窗口、控件或图像上进行 2D 绘图。

核心类

类名作用
QPainter执行实际绘图操作的类,提供 drawLine、drawRect、drawText 等方法
QPaintDevice抽象基类,表示可以被 QPainter 绘制的目标设备
QWidget继承自 QPaintDevice,是最常用的绘图目标(重写 paintEvent)
QPixmap/QImage/QPicture都继承自 QPaintDevice,分别用于屏幕优化位图、可直接访问像素的图像、可记录/回放的绘图指令

类关系简图

QPaintDevice ↑ ├── QWidget ├── QPixmap ├── QImage └── QPicture QPainter ——(uses)——→ QPaintDevice

注意:QPainter必须在QPaintDevicepaintEvent()(对 QWidget)或显式 begin/end 范围内使用。


二、Qt Graphics View Framework(高级图形视图框架)

适用于需要管理大量 2D 图形项、支持缩放/平移/交互的复杂场景(如流程图、CAD、游戏地图等)。

三大核心组件(MVC 架构思想)

组件作用
Model(数据)QGraphicsScene存储和管理所有图形项(QGraphicsItem及其子类)
View(视图)QGraphicsView提供可视化窗口,支持滚动、缩放、拖拽等交互
Item(元素)QGraphicsItem场景中的基本图形单元(如矩形、文本、自定义图形)

核心类详解

1.QGraphicsItem(抽象基类)
  • 所有图形项的基类。
  • 子类包括:
    • QGraphicsRectItem
    • QGraphicsEllipseItem
    • QGraphicsTextItem
    • QGraphicsPixmapItem
    • QGraphicsPathItem
    • QGraphicsLineItem
    • QGraphicsPolygonItem
    • 以及可自定义的派生类(需重写paint()boundingRect()
2.QGraphicsScene
  • 管理大量QGraphicsItem
  • 支持碰撞检测、选中、焦点、事件传播等。
  • 不直接显示,需通过QGraphicsView显示。
3.QGraphicsView
  • 继承自QScrollArea,提供滚动区域。
  • 可设置变换(如缩放scale()、旋转rotate())。
  • 可自定义渲染(如抗锯齿、OpenGL 后端)。

类关系简图

QGraphicsItem ←─── QGraphicsRectItem, QGraphicsTextItem, ... ↑ │ (owned by) QGraphicsScene ←───(displayed in)─── QGraphicsView ↑ │ (inherits) QObject

注意:QGraphicsView本身是一个 widget,内部使用QPainter渲染QGraphicsScene的内容。


三、其他高级绘图相关类

说明
QTransform表示 2D 仿射变换(平移、旋转、缩放、剪切)
QPen/QBrush控制线条样式和填充样式,用于QPainterQGraphicsItem
QPainterPath描述复杂路径,可用于裁剪、填充或作为QGraphicsPathItem
QStyleOptionGraphicsItem在自定义QGraphicsItem::paint()时传递样式信息

四、典型使用流程对比

基础绘图(QWidget + QPainter)

void MyWidget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawRect(10, 10, 100, 50); }

高级绘图(Graphics View)

QGraphicsScene *scene = new QGraphicsScene; QGraphicsView *view = new QGraphicsView(scene); QGraphicsRectItem *rect = scene->addRect(10, 10, 100, 50); rect->setFlag(QGraphicsItem::ItemIsMovable); // 可拖动 view->show();

总结

特性Paint SystemGraphics View Framework
适用场景简单、静态绘图(如自定义控件)复杂、动态、交互式图形(如编辑器、游戏)
性能轻量,但管理大量对象效率低高效(使用 BSP 树优化渲染与查找)
交互需手动处理事件内置选中、拖拽、碰撞检测
缩放/平移需手动实现内置支持(QGraphicsView::scale()

如果你有具体应用场景(比如做矢量绘图软件、流程图编辑器、2D 游戏等),我可以进一步推荐合适的类组合和设计模式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 2:50:06

音乐聚合播放器终极方案:7大平台一站式完美体验

音乐聚合播放器终极方案:7大平台一站式完美体验 【免费下载链接】listen1_chrome_extension one for all free music in china (chrome extension, also works for firefox) 项目地址: https://gitcode.com/gh_mirrors/li/listen1_chrome_extension 还在为音…

作者头像 李华
网站建设 2026/4/28 7:57:08

构建‘医疗问诊预筛’系统初步判断症状推荐就诊科室

构建“医疗问诊预筛”系统:用AI初步判断症状并推荐就诊科室 在三甲医院的清晨门诊大厅,总能看到这样的场景:一位中年患者拿着挂号单反复确认,“我这头晕、血压高,到底是挂神经内科还是心血管科?”导诊台前…

作者头像 李华
网站建设 2026/5/8 12:22:27

日语敬体与简体语音差异能否被正确还原

日语敬体与简体语音差异能否被正确还原——基于IndexTTS 2.0的多语言情感解耦语音合成技术解析 在动画配音现场,一个常见的尴尬场景是:角色明明身处正式场合,用着“です・ます”句式恭敬发言,可合成出的声音却语气轻佻、尾音急促&…

作者头像 李华
网站建设 2026/5/2 20:56:37

WarcraftHelper:魔兽争霸3现代化兼容性增强工具

WarcraftHelper:魔兽争霸3现代化兼容性增强工具 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典魔兽争霸3在新系统上运行不畅而…

作者头像 李华
网站建设 2026/4/26 17:01:20

如何快速修复小红书直播录制问题:5步终极操作指南

如何快速修复小红书直播录制问题:5步终极操作指南 【免费下载链接】DouyinLiveRecorder 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveRecorder 还在为小红书直播录制失败而烦恼吗?DouyinLiveRecorder作为支持50平台的专业直播录制工…

作者头像 李华
网站建设 2026/5/6 12:13:03

个人创作者如何用AI打造独特声音标识

个人创作者如何用AI打造独特声音标识 在短视频日均产量突破千万条的今天,一个鲜明的声音特征,可能比一张出镜的脸更具辨识度。你有没有发现,某些博主哪怕不露脸,只凭一句“哈喽大家好”,听众就能立刻认出是谁&#xff…

作者头像 李华