QGraphicsView-理论基础

本文详细介绍QGraphicsView的功能和使用方法,包括如何显示QGraphicsScene内容、设置场景可见位置、使用缓存模式、调整渲染提示等,并提供了丰富的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QGraphicsView

在线文档

以下简称:view

功能描述:提供一个小部件,用于显示QGraphicsScene的内容。要创建带有几何(形状:圆形、方形、二维三维等)场景,需要参考QGraphicsScene。view也是 Graphics View Framework的一部分。

可视化场景:

  1. 构造view对象,将可视化的场景(QGraphicsScene)地址传递给view;
  2. 也可以调用setScene(),在之后设置场景;
  3. show() view将滚动到场景中心,显示可见项目。
QGraphicsScene scene;
scene.addText("hello");

QGraphicsView view(&scene);
view.show();

场景可见位置设定:

  • 使用滚动条滚动到场景中的任何位置;
  • 将一个点传递给centerOn()函数,view将滚动视口确保该点剧中;
  • 如果想确保某个区域可见,可调用sureVisible()。

view可以显示整个场景或者场景中的一部分。默认情况,第一次显示scene会自动检测可视区域(调用:QGraphicsScene :: itemsBoundingRect()函数)。可以手动设置可视区域:view的setSceneRect()。当前手动设置时滚动条理论可以支持无限大小。但不会超过整数的最大值,最小值。

view调用render()展示场景。如果要改变绘画时view传递给QPainter的默认渲染提示:可以调用setRenderHints();

QPainter painter(this);

painter.setRenderHint(QPainter:: Antialiasing, true);  //设置渲染,启动反锯齿

painter.setPen( QPen(QColor(11,67,127),3));

painter.drawEllipse(40.0, 40.0, 100.0, 100.0);   //半径为50的圆


//链接地址:https://www.cnblogs.com/lifexy/p/9203929.html

默认情况view提供常规的QWidget展示场景,可以通过viewport()访问QWidget,也可通过setViewport()替换默认QWidget。要使用OenGL渲染,只需要调用setViewport(new QGLWidget)。view拥有窗体的所有权。

view使用QTransform支持仿射变换,可以传递矩阵setTransform变换,或者使用便捷的函数:

  • rotate()        旋转
  • scale()         缩放
  • translate()    转换
  • shear()         裁剪

最常用的是缩放和旋转。view转换期间视图中心保持不变。由于设置场景对齐(setAligment()),平移视图不会产生视觉影响。

可以使用鼠标、键盘和场景中的元素交互。view将事件封装了(QGraphicsSceneEvent)。可以对封装后的事件监听完成选取、拖拽、移动等。默认情况交互功能处于启用状态,可以通过setInteractive()切换。

view提供映射函数:

  • mapToScene()
  • mapFromScene()
  • items()
  • itemAt()

等函数方便视图坐标和场景坐标转换、查找场景元素等。

Header:#include <QGraphicsView>
qmake:QT += widgets
Since:Qt 4.2
Inherits:QAbstractScrollArea

 

枚举类型:


Cache:缓存

描述了为View的缓存模式设置的标志:

  • CacheNone    所有的绘画都直接在视口上完成
  • CachBackground    后台被缓存。会影响自定义背景以及使用backgroundBrush属性的背景。启用此标志,View将分配一个具有整个视口大小的像素图

描述在view拖动鼠标时做的默认动作:

  • NoDrag                 什么也不做
  • ScrollHandDrag    光标变为手指,拖动鼠标将滚动滚动条。在交互/非交互模式(不是用户点击鼠标等,可以是程序拖动,总之没有人机交互)都生效。
  • RubberBandDrag  出现橡皮筋框(类似截图时出现的小框),拖动鼠标将扩大区域并选中覆盖的场景元素。非交互下禁用此模式。

描述了可以用于改善渲染性能的一些标志,默认未启用,因为可能会产生副作用,不同绘制设备、平台可能有所不同。

  • DontClipPainter      已过期无效标识
  • DontSavePainterState  不要启用保存状态,保持状态的意思是调用QPainter::setPen()/setBrush()不用在绘画结束后回复状态。
  • DontAdjustForAntialiasing   禁用view的曝光区域抗锯齿自动调节功能,能够提高性能,副作用是使用抗锯齿绘制的项目在移动时会在场景留下绘画痕迹。
  • IndirectPainting      恢复旧的绘制算法,兼容旧代码

描述当用户调整视图大小或者转换视图时view可使用的锚点。

  • NoAnchor     没有锚点,场景位置保持不变
  • AnchorViewCenter   场景中心点作为锚点
  • AnchorUnderMouse  鼠标点被用于锚点

描述场景中内容如果改变view的更新方式

  • FullViewportUpdate    任何内容改变view将更新整个视口,这种更新很快,也是首选更新方式
  • MinimalViewportUpdate    将对最小视口区域进行重回,避免绘制未更改的区域,最大程度减少绘制时间(如果场景有许多细微变化,将花费更多时间寻找最小视口)。这是默认模式
  • SmartViewportUpdate   view会分析重绘区域从而找到最佳的更新模式
  • BoundingRectViewportUpdate    设定区域边界矩形内容重绘,优势在于手动设定某一个区域
  • NoViewportUpdate     场景改变,view不会自动更新,需要用户控制所有更新

 

常用函数

alignment()

setAlignment(Qt::Alignment alignment)

对齐方式设置:

Qt::AlignLeft、

Qt::AlignTop、

Qt::AlignCenter

backgroundBrush()

setBackgroundBrush(const QBrush &brush)

设置背景刷(更改背景颜色)
setCacheMode(QGraphicsView::CacheMode mode)缓存模式设置
setDragMode(QGraphicsView::DragMode mode)抓取模式设置
setForegroundBrush(const QBrush &brush)

前景色设置

setInteractive(bool allowed)

视图允许场景交互设置

启动:允许交互(鼠标、按键等)

关闭:忽视任何交互事件

setRenderHints(QPainter::RenderHints hints)

设置默认提示:抗锯齿、平滑变换

QPainter::Antialiasing

QPainter::SmoothPixmapTransform

setRubberBandSelectionMode(Qt::ItemSelectionMode mode

设置橡皮筋选择矩形(类似裁剪时的虚线框)

 

setSceneRect(const QRectF &rect)设置可视化场景区域
setViewportUpdateMode(QGraphicsView::ViewportUpdateMode mode)设置场景更新模式
  

其它参考Qt源码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值