一.场景(QGraphicsScene)
QGraphicsScene 提供了图形视图框架的场景,相当于一块画布,并具有以下功能。
1.一个管理大量图形项的快速接口。
2.向每个图形项传播事件
3.管理图形项的状态,比如选择,焦点处理等
4.提供无转换的渲染功能,主要用于打印
简单地一个场景使用
1 QGraphicsScene scene;//场景
2 scene.addText("Hello, world!");//添加文本图形项
3 QGraphicsView view(&scene);//设置视图
4 view.show();
1 addText("Hello, world!") 相当于执行了以下两句
2
3 QGraphicsTextItem *item = new QGraphicsTextItem("Hello, world!");
4 scene.addItem(item);
如果场景要删除一个图形项,可以使用
removeItem(item)
函数。
一般而言,场景层从下到上共分为3层,分别为背景层(backgroundLayer), 图形项层(Itemlayer)与前景层(ForegroundLayer)。场景绘制总是从背景层开始,然后是图形层,最后是前景层。
1 scene.setForegroundBrush(QColor(255,255,255,100));//前景层颜色为白色半透明
2 scene.setBackgroundBrush(Qt::green);//背景色设置为绿色
对于前景层,我们一般不进行设置,或者像上面这样设置为半透明的白色。对于背景层,这里设置为了绿色,当然,我们也可以将一张图片设置为背景。
scene.setBackgroundBrush(QPixmap(":/background.jpg"));
2. 场景边界矩形
场景大小默认是没有限制的,图形项可以放到场景的任何位置。而场景的边界矩形仅用于场景内部进行索引的维护。
因为如果没有边界矩形,场景就要搜索所有的图形项,然后确定出其边界,这是十分费时的。所以如果要操作一个较大的场景,我们应该给出它的边界矩形。设置边界矩形,可以使用setSceneRect()函数。
3.图形项查找
场景最大的优势之一就是可以快速的锁定图形项的位置,即使有上百万个图形项,items()函数也能在数毫秒的时间内锁定一个图形项的位置。items()函数有几个重载函数来方便的进行图形项的查找。但是有时在场景的一个点可能重叠着几个图形项,这时我们可以使用itemAt()函数返回最上面的一个图形项。对于这些函数的使用,我们到后面讲视图时再举例讲解。
4.事件处理和传播
场景可以传播来自视图的事件,将事件传播给该点最顶层的图形项。但是就像我们在讲图形项时所说的那样,如果一个图形项要接收键盘事件,那么它必须获得焦点。而且,如果我们在场景中重写了事件处理函数,那么在该函数的最后,必须调用场景默认的事件处理函数,只有这样,图形项才能接收到该事件。这一点我们也到后面讲视图时再细讲。
二.视图(QGraphicsView)
QGraphicsView 提供了视图窗口部件,它使场景的内容可视化。你可以给一个场景关联多个视图,从而给一个数据集提供多个视口。视图部件是一个滚动区域,就是说,它可以提供一个滚动条来显示大型的场景。如果要使用OpenGL,你可以使用QGraphicsView::setViewport()函数来添加QGLWidget 。
(一)缩放与旋转
1 QGraphicsView::scale(xScale, yScale);//在分别在x,y方向上缩放xScale,yScale倍。若为1.0倍,则不进行缩放。
2 QGraphicsView::rotate(90);//顺时针旋转90度
setAlignment(Qt::AlignLeft | Qt::AlignTop);
1 QGraphicsView::NoDrag :忽略鼠标事件,不可以拖动。 2 QGraphicsView::ScrollHandDrag :光标变为手型,可以拖动场景进行移动。 3 QGraphicsView::RubberBandDrag :使用橡皮筋效果,进行区域选择,可以选中一个区域内的所有图形项。
setDragMode(QGraphicsView::ScrollHandDrag);//手型拖动
scene->setSceneRect(0,0,800,800);
QGraphicsView::mousePressEvent(event);
QGraphicsView::mousePressEvent(event);
QGraphicsScene::keyPressEvent(event);
setCacheMode(QGraphicsView::CacheBackground);
QT += opengl
#include <QtOpenGL>
1 QGLWidget *widget =new QGLWidget(this);
2 setViewport(widget);
1 void MyView::mousePressEvent(QMouseEvent*event)
2 {
3 rotate(90); //视图旋转顺时针90度
4 QPixmap pixmap(400,400); //必须指定大小
5 QPainter painter(&pixmap);
6 render(&painter,QRectF(0,0,400,400),QRect(0,0,400,400)); //打印视图指定区域内容
7 pixmap.save("../graphicsView04/save.png");
8 QGraphicsView::mousePressEvent(event);
9 }
scene()->render(&painter,QRectF(0,0,400,400),QRect(0,0,400,400));//打印场景内容
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)