QT6中QGraphicsView功能与应用

一.QGraphicsView

1.简介

QGraphicsView 框架是 Qt 中用于管理和交互大量 2D 图形对象的强大系统。它特别适合开发需要处理复杂图形场景的应用程序,如绘图软件、CAD 系统、数据可视化、游戏等。

2.Graphics View 核心功能与优势

高效管理大量图元:支持同时显示数千甚至数万个图形项(Item),性能远优于传统的QWidget绘图(如QPainter直接绘制)。

灵活的坐标系统:支持场景坐标、视图坐标、图元本地坐标三级坐标转换,轻松实现缩放、旋转、平移等变换。

丰富的交互支持:内置鼠标 / 键盘事件处理,支持图元选择、拖动、旋转、缩放,可自定义交互逻辑。

碰撞检测:提供图元间碰撞检测接口,无需手动计算。

动画与状态过渡:可结合QPropertyAnimation实现图元的平滑动画(位置、大小、透明度等)。

可扩展性:支持自定义图元(继承QGraphicsItem)、自定义视图(继承QGraphicsView),满足复杂需求。

3.Graphics View 框架架构

Graphics View 采用场景-视图 架构,包含三个核心类:

QGraphicsScene 图形场景容器,管理所有图形项

QGraphicsView 视图组件,用于显示场景内容

QGraphicsItem 图形项的基类,所有图形元素都继承自此类

4.坐标系统详解

Graphics View 的坐标系统分为三级,理解它们的转换关系是使用框架的关键:

图元坐标(Item Coordinates):图元自身的局部坐标,原点通常在图元中心或左上角(由图元定义)。例如,QGraphicsRectItem的坐标以其左上角为原点。

场景坐标(Scene Coordinates):场景的全局坐标,原点在场景中心(默认),所有图元在场景中都有唯一的场景坐标。图元的位置、大小等属性最终会转换为场景坐标。

视图坐标(View Coordinates):视图(QGraphicsView)的设备坐标(像素),原点在视图左上角。视图负责将场景坐标转换为视图坐标(考虑缩放、旋转等变换)。

二.基本用法示例

#include <QApplication>

#include <QGraphicsView>

#include <QGraphicsScene>

#include <QGraphicsRectItem>

#include <QGraphicsEllipseItem>

#include <QGraphicsTextItem>

#include <QTimer>

int main(int argc, char *argv\[\]) {

QApplication app(argc, argv);

// 创建场景(坐标系,管理图形项)

QGraphicsScene *scene = new QGraphicsScene();

scene->setSceneRect(0, 0, 800, 600); // 设置场景范围

scene->setBackgroundBrush(Qt::lightGray); // 设置背景色

// 创建矩形项

QGraphicsRectItem *rectItem = new QGraphicsRectItem(0, 0, 200, 100);

rectItem->setPos(100, 100);

rectItem->setBrush(QBrush(Qt::blue));

rectItem->setPen(QPen(Qt::black, 2));

scene->addItem(rectItem);

// 创建椭圆项

QGraphicsEllipseItem *ellipseItem = new QGraphicsEllipseItem(0, 0, 150, 100);

ellipseItem->setPos(400, 200);

ellipseItem->setBrush(QBrush(Qt::red));

ellipseItem->setPen(QPen(Qt::black, 2));

scene->addItem(ellipseItem);

// 创建文本项

QGraphicsTextItem *textItem = new QGraphicsTextItem("Hello Graphics View!");

textItem->setPos(200, 400);

textItem->setDefaultTextColor(Qt::white);

textItem->setFont(QFont("Arial", 16));

scene->addItem(textItem);

// 创建视图(显示场景的窗口)

QGraphicsView *view = new QGraphicsView(scene,this);

view->setWindowTitle("QT6 Graphics View 示例");

view->resize(1000, 800);

// 启用抗锯齿

view->setRenderHint(QPainter::Antialiasing);

// 显示视图

view->show();

return app.exec();

}

相关推荐
Wang's Blog13 小时前
Java 项目实战:交友项目 - 联系人管理需求分析
java·开发语言·交友
lusklusklusk13 小时前
Python 全局变量与局部变量区别——global 关键字、__main__ 块与作用域示例
开发语言·前端·python
马剑威(威哥爱编程)13 小时前
Python 智能体开发实战 01:装了三遍环境还在报错?虚拟环境和 DeepSeek 一次配到位
开发语言·人工智能·python·agent
qq_4663024513 小时前
如何通过部分文件名,读取出整个文件名
c++·qt
octopus_c13 小时前
C++ 入门
开发语言·c++·算法
步行cgn14 小时前
JSON.stringify 详解:把 JavaScript 对象变成 JSON 字符串
开发语言·javascript·json
raindayinrain14 小时前
c++新特性--实用新特性
c++
Soneswy14 小时前
C++基础篇——类与对象(中)
开发语言·c++
CoderYanger14 小时前
Java EE 进阶:5. Spring IoC&DI(第二弹):Spring IoC
java·开发语言·spring boot·spring·面试·职场和发展·java-ee
青峰讲运维15 小时前
OpenStack Heat 编排:用模板一键交付云业务,告别手动点页面
开发语言·php·openstack