QGraphicsView 类
QGraphicsView 类提供了一个小部件,用于显示 QGraphicsScene 的内容。...
头文件 | #include <QGraphicsView> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
qmake | QT += widgets |
继承 | QAbstractScrollArea |
公共类型
标志 | 缓存模式 |
枚举 | CacheModeFlag { CacheNone, CacheBackground } |
枚举 | DragMode { NoDrag, ScrollHandDrag, RubberBandDrag } |
枚举 | OptimizationFlag { DontSavePainterState, DontAdjustForAntialiasing, IndirectPainting } |
标志 | 优化标志 |
枚举 | ViewportAnchor { NoAnchor, AnchorViewCenter, AnchorUnderMouse } |
枚举 | ViewportUpdateMode { FullViewportUpdate, MinimalViewportUpdate, SmartViewportUpdate, BoundingRectViewportUpdate, NoViewportUpdate } |
属性
|
|
公共函数
QGraphicsView(QWidget *parent = nullptr) | |
QGraphicsView(QGraphicsScene *scene, QWidget *parent = nullptr) | |
virtual | ~QGraphicsView() |
Qt::Alignment | alignment() const |
QBrush | backgroundBrush() const |
QGraphicsView::CacheMode | cacheMode() const |
void | centerOn(const QPointF &pos) |
void | centerOn(qreal x, qreal y) |
void | centerOn(const QGraphicsItem *item) |
QGraphicsView::DragMode | dragMode() const |
void | ensureVisible(const QRectF &rect, int xmargin = 50, int ymargin = 50) |
void | ensureVisible(qreal x, qreal y, qreal w, qreal h, int xmargin = 50, int ymargin = 50) |
void | ensureVisible(const QGraphicsItem *item, int xmargin = 50, int ymargin = 50) |
void | fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio) |
void | fitInView(qreal x, qreal y, qreal w, qreal h, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio) |
void | fitInView(const QGraphicsItem *item, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio) |
QBrush | foregroundBrush() const |
bool | isInteractive() const |
bool | isTransformed() const |
QGraphicsItem * | itemAt(const QPoint &pos) const |
QGraphicsItem * | itemAt(int x, int y) const |
QList<QGraphicsItem *> | items() const |
QList<QGraphicsItem *> | items(const QPoint &pos) const |
QList<QGraphicsItem *> | items(int x, int y) const |
QList<QGraphicsItem *> | items(const QRect &rect, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const |
QList<QGraphicsItem *> | items(int x, int y, int w, int h, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const |
QList<QGraphicsItem *> | items(const QPolygon &polygon, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const |
QList<QGraphicsItem *> | items(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const |
QPoint | mapFromScene(const QPointF &point) const |
QPolygon | mapFromScene(const QRectF &rect) const |
QPolygon | mapFromScene(const QPolygonF &polygon) const |
QPainterPath | mapFromScene(const QPainterPath &path) const |
QPoint | mapFromScene(qreal x, qreal y) const |
QPolygon | mapFromScene(qreal x, qreal y, qreal w, qreal h) const |
QPointF | mapToScene(const QPoint &point) const |
QPolygonF | mapToScene(const QRect &rect) const |
QPolygonF | mapToScene(const QPolygon &polygon) const |
QPainterPath | mapToScene(const QPainterPath &path) const |
QPointF | mapToScene(int x, int y) const |
QPolygonF | mapToScene(int x, int y, int w, int h) const |
QGraphicsView::OptimizationFlags | optimizationFlags() const |
void | render(QPainter *painter, const QRectF &target = QRectF(), const QRect &source = QRect(), Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio) |
QPainter::RenderHints | renderHints() const |
void | resetCachedContent() |
void | resetTransform() |
QGraphicsView::ViewportAnchor | resizeAnchor() const |
void | rotate(qreal angle) |
QRect | rubberBandRect() const |
Qt::ItemSelectionMode | rubberBandSelectionMode() const |
void | scale(qreal sx, qreal sy) |
QGraphicsScene * | scene() const |
QRectF | sceneRect() const |
void | setAlignment(Qt::Alignment alignment) |
void | setBackgroundBrush(const QBrush &brush) |
void | setCacheMode(QGraphicsView::CacheMode mode) |
void | setDragMode(QGraphicsView::DragMode mode) |
void | setForegroundBrush(const QBrush &brush) |
void | setInteractive(bool allowed) |
void | setOptimizationFlag(QGraphicsView::OptimizationFlag flag, bool enabled = true) |
void | setOptimizationFlags(QGraphicsView::OptimizationFlags flags) |
void | setRenderHint(QPainter::RenderHint hint, bool enabled = true) |
void | setRenderHints(QPainter::RenderHints hints) |
void | setResizeAnchor(QGraphicsView::ViewportAnchor anchor) |
void | setRubberBandSelectionMode(Qt::ItemSelectionMode mode) |
void | setScene(QGraphicsScene *scene) |
void | setSceneRect(const QRectF &">rect)) |
void | setSceneRect(qreal x, qreal y, qreal w, qreal h) |
void | setTransform(const QTransform &matrix, bool combine = false) |
void | setTransformationAnchor(QGraphicsView::ViewportAnchor anchor) |
void | setViewportUpdateMode(QGraphicsView::ViewportUpdateMode mode) |
void | shear(qreal sh, qreal sv) |
QTransform | transform() const |
QGraphicsView::ViewportAnchor | transformationAnchor() const |
void | translate(qreal dx, qreal dy) |
QTransform | viewportTransform() const |
QGraphicsView::ViewportUpdateMode | viewportUpdateMode() const |
重写公共函数
virtual QVariant | inputMethodQuery(Qt::InputMethodQuery query) const override |
virtual QSize | sizeHint() const override |
公共槽
void | invalidateScene(const QRectF &rect = QRectF(), QGraphicsScene::SceneLayers layers = QGraphicsScene::AllLayers) |
void | updateScene(const QList<QRectF> &rects) |
void | updateSceneRect(const QRectF &rect) |
信号
void | rubberBandChanged(QRect rubberBandRect, QPointF fromScenePoint, QPointF toScenePoint) |
保护函数
virtual void | drawBackground(QPainter *painter, const QRectF &rect) |
virtual void | drawForeground(QPainter *painter, const QRectF &rect) |
重写保护函数
virtual void | contextMenuEvent(QContextMenuEvent *event) override |
virtual void | dragEnterEvent(QDragEnterEvent *event) override |
virtual void | dragLeaveEvent(QDragLeaveEvent *event) override |
virtual void | dragMoveEvent(QDragMoveEvent *event) override |
virtual void | dropEvent(QDropEvent *event) override |
virtual bool | 事件(QEvent *event) override |
virtual void | 焦点进入事件(QFocusEvent *event) override |
virtual bool | 焦点下一个前一个子项事件(bool next) override |
virtual void | 焦点退出事件(QFocusEvent *event) override |
virtual void | 输入法事件(QInputMethodEvent *event) override |
virtual void | 按键按下事件(QKeyEvent *event) override |
virtual void | 按键释放事件(QKeyEvent *event) override |
virtual void | 鼠标双击事件(QMouseEvent *event) override |
virtual void | 鼠标移动事件(QMouseEvent *event) override |
virtual void | 鼠标按下事件(QMouseEvent *event) override |
virtual void | 鼠标释放事件(QMouseEvent *event) override |
virtual void | 绘制事件(QPaintEvent *event) override |
virtual void | 大小调整事件(QResizeEvent *event) override |
virtual void | 根据偏移量滚动内容(int dx, int dy) override |
virtual void | 显示事件(QShowEvent *event) override |
virtual bool | 视口事件(QEvent *event) override |
virtual void | 鼠标滚轮事件(QWheelEvent *event) override |
保护槽函数
virtual void | 设置视口(QWidget *widget) override |
详细描述
QGraphicsView 在可滚动的视口中可视化了 QGraphicsScene 的内容。要创建包含几何项的场景,请参阅 QGraphicsScene 的文档。QGraphicsView 是 图形视图框架 的一部分。
要可视化场景,首先构建一个 QGraphicsView 对象,将你要可视化的场景的地址传递给 QGraphicsView 构造函数。或者,你可以在稍后调用 setScene() 来设置场景。在调用 show() 之后,视图将默认滚动到场景中心并显示此时可见的任何项。例如
QGraphicsScene scene; scene.addText("Hello, world!"); QGraphicsView view(&scene); view.show();
你可以使用滚动条或调用 centerOn() 明确将视口滚动到场景上的任何位置。通过向 centerOn() 传递一个点,QGraphicsView 将滚动其视口以确保该点是视图的中心。提供一个重载用于滚动到 QGraphicsItem,此时 QGraphicsView 将确保项的中心位于视图中。如果你想确保某个区域可见(但不一定是居中),可以调用 ensureVisible()。
QGraphicsView 可以用来可视化整个场景或其一部分。默认情况下,可视区域在视图首次显示时自动检测(通过调用 QGraphicsScene::itemsBoundingRect())。要自己设置可视区域矩形,可以调用 setSceneRect()。这将适当地调整滚动条的取值范围。请注意,尽管场景支持几乎无限的大小,但滚动条的取值范围永远不会超过整数(INT_MIN, INT_MAX)的范围。
QGraphicsView通过调用render()来可视化场景。默认情况下,使用常规的QPainter和默认渲染提示将项目绘制到视口上。要更改QGraphicsView在绘制项目时传递给QPainter的默认渲染提示,可以调用setRenderHints。
默认情况下,QGraphicsView为视口小部件提供了一个常规的QWidget。您可以通过调用viewport()访问此小部件,或者通过调用setViewport()来替换它。要使用OpenGL进行渲染,只需调用setViewport(new QOpenGLWidget)。QGraphicsView将拥有视口小部件的所有权。
QGraphicsView支持仿射变换,使用QTransform。您可以传递一个矩阵给setTransform(),或者调用其中一个便捷函数rotate()、scale()、translate()或shear()。最常使用的两个转换是缩放和旋转,用于实现缩放。QGraphicsView在变换期间保持视图中心固定。由于场景对齐(setAlignment()),移动视图不会有视觉影响。
您可以使用鼠标和键盘与场景中的项目交互。QGraphicsView将鼠标和键事件转换为场景事件(继承自QGraphicsSceneEvent)并将它们传递到可视化的场景。最后,处理事件并对其做出反应的是单个项目。例如,如果您单击可选择的项,该项通常会告知场景已被选中,并且它还会重新绘制自己以显示选择矩形。同样,如果单击并拖动鼠标来移动可移动的项目,处理鼠标移动并移动自己的是项。项交互默认启用,您可以通过调用setInteractive()来切换它。
您还可以通过创建QGraphicsView的子类并重新实现鼠标和键事件处理器来提供自己的自定义场景交互。为了简化与视图中项的编程交互,QGraphicsView提供了映射函数mapToScene()和mapFromScene(),以及项访问器items()和itemAt()。这些函数允许您在视图坐标和场景坐标之间映射点、矩形、多边形和路径,并使用视图坐标在场景中查找项。
当使用QOpenGLWidget作为视口时,支持立体渲染。这是使用与QOpenGLWidget::paintGL相同的模式完成的。要启用它,启用QSurfaceFormat::StereoBuffers标志。由于标志在内部的处理方式,在创建窗口之前使用QSurfaceFormat::setDefaultFormat()全局设置QSurfaceFormat::StereoBuffers标志。如果启用了标志且有硬件支持立体渲染,则drawBackground()和drawForeground()将在每个帧中触发两次。通过调用QOpenGLWidget::currentTargetBuffer()来查询当前正在绘制的缓冲区。
注意: 使用OpenGL视口会限制使用QGraphicsProxyWidget的功能。并非所有的小部件和样式组合都能在这种配置下得到支持。您应该仔细测试您的用户界面并进行必要的调整。
参阅:QGraphicsScene、QGraphicsItem和QGraphicsSceneEvent。
成员类型文档
枚举 QGraphicsView::CacheModeFlag
标志 QGraphicsView::CacheMode
此枚举描述了可以为QGraphicsView的缓存模式设置的标志。
常量 | 值 | 描述 |
---|---|---|
QGraphicsView::CacheNone | 0x0 | 所有绘图都直接在视口中进行。 |
QGraphicsView::CacheBackground | 0x1 | 背景被缓存。这会影响自定义背景和基于backgroundBrush属性生成的背景。启用此标志后,QGraphicsView将分配一个全尺寸视图区的位图。 |
CacheMode类型是QFlags<CacheModeFlag>的typedef。它存储了CacheModeFlag值的OR组合。
参阅:cacheMode。
枚举 QGraphicsView::DragMode
此枚举描述了在视口上按下鼠标并拖动鼠标时的默认视图操作。
常量 | 值 | 描述 |
---|---|---|
QGraphicsView::NoDrag | 0 | 不会发生任何事情;忽略鼠标事件。 |
QGraphicsView::ScrollHandDrag | 1 | 光标将变成指向手,拖动鼠标会在滚动条周围滚动。此模式在交互模式和非交互模式中都可以使用。 |
QGraphicsView::RubberBandDrag | 2 | 会出现一个橡皮筋。拖动鼠标会设置橡皮筋几何形状,橡皮筋覆盖的所有项目都将被选中。此模式对非交互视图无效。 |
参阅:dragMode和QGraphicsScene::setSelectionArea。
枚举 QGraphicsView::OptimizationFlag
标志 QGraphicsView::OptimizationFlags
此枚举描述了可以启用以改善QGraphicsView渲染性能的标志。默认情况下,所有这些标志均未设置。请注意,设置标志通常会产生副作用,并且这种影响可能在不同绘图设备和平台上有所不同。
常量 | 值 | 描述 |
---|---|---|
QGraphicsView::DontSavePainterState | 0x1 | 在渲染时,当渲染背景或前景以及每个项目时,QGraphicsView会保护绘图状态(请参阅QPainter::save()),这允许您在渲染后留下绘图状态的改变(例如,您可以在渲染后不恢复状态就调用QPainter::setPen()或QPainter::setBrush())。然而,如果项目一致地恢复状态,您应该启用此标志以防止QGraphicsView做相同的事情。 |
QGraphicsView::DontAdjustForAntialiasing | 0x2 | 禁用QGraphicsView对暴露区域抗锯齿自动调整。在它们的QGraphicsItem::boundingRect()边界的边界上渲染抗锯齿线条的项目可能会导致线条的部分渲染到外部。为了防止渲染伪影,QGraphicsView将所有暴露区域在所有方向上扩大2个像素。如果您启用此标志,QGraphicsView将不再执行这些调整,从而最小化需要重绘的面积,这提高了性能。一个常见的副作用是,使用抗锯齿绘制的项目在移动时可能在场景中留下绘画痕迹。 |
QGraphicsView::IndirectPainting | 0x4 | 自Qt 4.6起,恢复调用QGraphicsView::drawItems()和QGraphicsScene::drawItems()的旧绘画算法。仅用于与旧代码兼容。 |
OptimizationFlags类型是QFlags<OptimizationFlag>的类型定义。它存储OptimizationFlag值的OR组合。
枚举QGraphicsView::ViewportAnchor
此枚举定义了QGraphicsView在用户调整视图或视图变换时可以使用的可能锚点。
常量 | 值 | 描述 |
---|---|---|
QGraphicsView::NoAnchor | 0 | 无锚点,即视图保持场景位置不变。 |
QGraphicsView::AnchorViewCenter | 1 | 视图中心处的场景点是锚点。 |
QGraphicsView::AnchorUnderMouse | 2 | 鼠标下方的点用作锚点。 |
另请参阅resizeAnchor和transformationAnchor。
枚举QGraphicsView::ViewportUpdateMode
此枚举描述了QGraphicsView在场景内容更改或暴露时如何更新其视口。
常量 | 值 | 描述 |
---|---|---|
QGraphicsView::FullViewportUpdate | 0 | 当场景的任何可见部分发生更改或重新暴露时,QGraphicsView将更新整个视口。这种方法在QGraphicsView在确定要绘制的内容上花费的时间比绘制要花的时间更多时(例如,当有很多小项目需要重复更新时)是最快的。这是不支持部分更新的视图(例如QOpenGLWidget)和需要禁用滚动优化的视图的首选更新模式。 |
QGraphicsView::MinimalViewportUpdate | 1 | QGraphicsView将确定需要重绘的最小视口区域,通过避免重绘未更改的区域来最小化绘制所花费的时间。这是QGraphicsView的默认模式。尽管这种方法通常提供最佳性能,但如果场景上有许多小的可见更改,QGraphicsView在寻找最小方法上花费的时间可能会超过绘图所花费的时间。 |
QGraphicsView::SmartViewportUpdate | 2 | QGraphicsView将尝试通过分析需要重绘的区域来找到最优更新模式。 |
QGraphicsView::BoundingRectViewportUpdate | 4 | 视口中所有更改的边界矩形将被重绘。这种模式的优势在于QGraphicsView只需搜索一个区域即可查找更改,从而最小化确定需要重绘内容花费的时间。缺点是需要重绘未更改的区域。 |
QGraphicsView::NoViewportUpdate | 3 | 当场景更改时,QGraphicsView将不会更新其视口;用户应控制所有更新。此模式禁用了QGraphicsView中所有(可能较慢)的项目可见性测试,适用于需要固定帧率或视口其他外部更新的场景。 |
另请参阅 viewportUpdateMode.
属性说明
alignment : Qt::Alignment
该属性存放场景在视图中完全可见时的对齐方式。
如果整个场景在视图中可见(即没有可见的滚动条),视图的对齐方式将决定场景在视图中的渲染位置。例如,如果对齐方式为默认的 Qt::AlignCenter,则场景将在视图中居中,如果对齐方式为 Qt::AlignLeft | Qt::AlignTop,则场景将在视图的左上角渲染。
访问函数
Qt::Alignment | alignment() const |
void | setAlignment(Qt::Alignment alignment) |
backgroundBrush : QBrush
该属性存放场景的背景画笔。
该属性设置此视图中场景的背景画笔。它用于覆盖场景自身的背景,并且定义了 drawBackground() 的行为。要为此视图提供自定义的背景绘制,可以重写 drawBackground()。
默认情况下,该属性包含一个具有 Qt::NoBrush 图案刷的画笔。
访问函数
QBrush | backgroundBrush() const |
void | setBackgroundBrush(const QBrush &brush) |
另请参阅 QGraphicsScene::backgroundBrush 和 foregroundBrush.
cacheMode : CacheMode
该属性存放视图中哪些部分被缓存。
QGraphicsView 可以将预渲染的内容缓存在一个 QPixmap 中,然后将该内容绘制到视口中。这样的缓存目的是加快渲染速度较慢的区域。例如,纹理、渐变和透明度混合背景可能会相当慢;特别是在经过变换的视图中。CacheBackground 标志启用了视图背景的缓存。例如
QGraphicsView view; view.setBackgroundBrush(QImage(":/images/backgroundtile.png")); view.setCacheMode(QGraphicsView::CacheBackground);
每次视图被变换时,缓存都会失效。然而,在滚动时,只需要部分失效。
默认情况下,没有任何内容被缓存。
访问函数
QGraphicsView::CacheMode | cacheMode() const |
void | setCacheMode(QGraphicsView::CacheMode mode) |
另请参阅 resetCachedContent() 和 QPixmapCache.
dragMode : DragMode
该属性存放左键按下时鼠标在场景中拖动的行为。
该属性定义了当用户在场景背景上点击并拖动鼠标时应发生什么(例如,使用指向光标滚动视图内容或使用橡皮筋选择多个项目)。默认值 NoDrag 不执行任何操作。
此行为仅影响未由任何项目处理的鼠标点击。您可以通过创建一个 QGraphicsView 的子类并重写 mouseMoveEvent() 来定义自定义行为。
访问函数
QGraphicsView::DragMode | dragMode() const |
void | setDragMode(QGraphicsView::DragMode mode) |
前景画笔 : QBrush
此属性保存场景的前景画笔。
此属性用于设置当前视图中场景的前景画笔。它用于覆盖场景自带的前景,并定义了drawForeground()的行为。要提供此视图的自定义前景绘制,可以重新实现drawForeground()[Closed]。
默认情况下,该属性包含一个具有 Qt::NoBrush 图案刷的画笔。
访问函数
QBrush | foregroundBrush() const |
void | setForegroundBrush(const QBrush &brush) |
另请参阅:QGraphicsScene::foregroundBrush和backgroundBrush。
交互 : bool
此属性保存视图是否允许场景交互。
如果启用,此视图设置为允许场景交互。否则,此视图不允许交互,任何鼠标或键盘事件都将被忽略(即,它将作为只读视图工作)。
默认情况下,此属性为true
。
访问函数
bool | isInteractive() const |
void | setInteractive(bool allowed) |
优化标志 : OptimizationFlags
这些标志可用来调整QGraphicsView的性能。
QGraphicsView使用裁剪、额外的边界矩形调整和某些其他辅助手段来提高常见图形场景的渲染质量和性能。然而,根据目标平台、场景和使用的大小视图,这些操作中的一些可能会降低性能。
效果因标志而异;有关详细信息,请参阅OptimizationFlags文档。
默认情况下,未启用任何优化标志。
访问函数
QGraphicsView::OptimizationFlags | optimizationFlags() const |
void | setOptimizationFlags(QGraphicsView::OptimizationFlags flags) |
另请参阅:setOptimizationFlag。
渲染提示 : QPainter::RenderHints
此属性保存视图的默认渲染提示。
这些提示用于在绘制每个可见项之前初始化QPainter。使用渲染提示来切换渲染功能,如抗锯齿和平滑位图转换。
QPainter::TextAntialiasing是默认启用的。
示例
QGraphicsScene scene; scene.addRect(QRectF(-10, -10, 20, 20)); QGraphicsView view(&scene); view.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); view.show();
访问函数
QPainter::RenderHints | renderHints() const |
void | setRenderHints(QPainter::RenderHints hints) |
调整大小锚点 : ViewportAnchor
调整视图大小时,视图应该如何定位场景。
QGraphicsView使用此属性来决定如何在视图大小变化时定位场景。默认行为是NoAnchor,在调整大小时保持场景位置不变;视图的左上角在调整大小时将看起来固定。
请注意,当场景只有一部分可见时(即存在滚动条时),此属性的效应才会明显。否则,如果整个场景都可以在视图中显示,QGraphicsScene 将使用视图的 对齐方式 来定位场景。
访问函数
QGraphicsView::ViewportAnchor | resizeAnchor() const |
void | setResizeAnchor(QGraphicsView::ViewportAnchor anchor) |
rubberBandSelectionMode : Qt::ItemSelectionMode
此属性包含使用了橡皮筋选择框选择项的行为。
此属性定义了在使用 RubberBandDrag 拖动模式时如何选择项。
默认值是 Qt::IntersectsItemShape;所有与橡皮筋形状相交或包含橡皮筋形状的项都被选中。
访问函数
Qt::ItemSelectionMode | rubberBandSelectionMode() const |
void | setRubberBandSelectionMode(Qt::ItemSelectionMode mode) |
sceneRect : QRectF
此属性包含此视图可视化的场景区域。
场景矩形定义了场景的范围,在视图的情况下,这表示你可以使用滚动条导航的场景区域。
如果没有设置,或者设置了空 QRectF,则此属性与 QGraphicsScene::sceneRect 的值相同,并且它将随着 QGraphicsScene::sceneRect 更改。否则,视图的场景矩形不受场景的影响。
请注意,虽然场景支持几乎无限的大小,但滚动条的值永远不会超过整数的范围(INT_MIN, INT_MAX)。当场景大于滚动条的值时,你可以选择使用 translate() 来在场景中导航。
默认情况下,此属性包含一个原点的矩形,宽度为0,高度为0。
访问函数
QRectF | sceneRect() const |
void | setSceneRect(const QRectF &rect) |
void | setSceneRect(qreal x, qreal y, qreal w, qreal h) |
另请参阅QGraphicsScene::sceneRect。
transformationAnchor : ViewportAnchor
这在变换期间应该如何定位场景。
QGraphicsView 使用此属性决定在变换矩阵更改和视图坐标系统变换时如何在视口中对齐场景。默认行为 AnchorViewCenter 确保在变换(例如旋转时)时,视图中心的场景点保持不变(例如,场景将看起来绕视图中心旋转)。
请注意,当场景只有一部分可见时(即存在滚动条时),此属性的效应才会明显。否则,如果整个场景都可以在视图中显示,QGraphicsScene 将使用视图的 对齐方式 来定位场景。
访问函数
QGraphicsView::ViewportAnchor | transformationAnchor() const |
void | setTransformationAnchor(QGraphicsView::ViewportAnchor anchor) |
viewportUpdateMode : ViewportUpdateMode
视口应该如何更新其内容。
QGraphicsView 使用此属性来决定如何更新重新暴露或更改的场景区域。通常您不需要修改此属性,但在某些情况下,这样做可以提高渲染性能。有关详细信息,请参阅 ViewportUpdateMode 文档。
默认值为 MinimalViewportUpdate,其中 QGraphicsView 将尽可能更新最小视口区域。
访问函数
QGraphicsView::ViewportUpdateMode | viewportUpdateMode() const |
void | setViewportUpdateMode(QGraphicsView::ViewportUpdateMode mode) |
另请参阅 ViewportUpdateMode 和 cacheMode。
成员函数文档
QGraphicsView::QGraphicsView(QWidget *parent = nullptr)
构建一个 QGraphicsView。 parent 传递给 QWidget 的构造函数。
QGraphicsView::QGraphicsView(QGraphicsScene *scene, QWidget *parent = nullptr)
构建一个 QGraphicsView 并将可视化的场景设置为 scene。 parent 传递给 QWidget 的构造函数。
[虚拟 noexcept]
QGraphicsView::~QGraphicsView()
销毁 QGraphicsView 对象。
void QGraphicsView::centerOn(const QPointF &pos)
将视口内容滚动以确保场景坐标 pos 在视图中居中。
由于 pos 是一个浮点坐标,而滚动条操作整数坐标,居中只是一个近似值。
注意:如果项目靠近或超出边界,它将在视图中可见,但不会居中。
另请参阅 ensureVisible。
void QGraphicsView::centerOn(qreal x, qreal y)
这是一个重载函数。
此函数提供方便。它等效于调用 centerOn(QPointF(x, y))。
void QGraphicsView::centerOn(const QGraphicsItem *item)
这是一个重载函数。
将视口内容滚动以确保 item 在视图中居中。
另请参阅 ensureVisible。
[覆盖虚拟受保护]
void QGraphicsView::contextMenuEvent(QContextMenuEvent *event)
重实现:QAbstractScrollArea::contextMenuEvent(QContextMenuEvent *e)。
[覆盖虚拟受保护]
void QGraphicsView::dragEnterEvent(QDragEnterEvent *event)
重实现:QAbstractScrollArea::dragEnterEvent(QDragEnterEvent *event)。
[重写虚保护]
void QGraphicsView::dragLeaveEvent(QDragLeaveEvent *event)
重新实现: QAbstractScrollArea::dragLeaveEvent(QDragLeaveEvent *event).
[重写虚保护]
void QGraphicsView::dragMoveEvent(QDragMoveEvent *event)
重新实现: QAbstractScrollArea::dragMoveEvent(QDragMoveEvent *event).
[虚保护]
void QGraphicsView::drawBackground(QPainter *painter, const QRectF &rect)
使用 painter 绘制场景的背景,在绘制任何项目和前景之前。重新实现此函数以为此视图提供自定义背景。
如果只是想要定义背景的颜色、纹理或渐变,可以调用 setBackgroundBrush() 代替。
所有绘制均在 场景 坐标系中进行。rect 是暴露的矩形。
默认实现使用视图的 backgroundBrush 填充 rect。如果没有定义此类画笔(默认),则调用场景的 drawBackground() 函数。
另请参阅drawForeground() 和 QGraphicsScene::drawBackground().
[虚保护]
void QGraphicsView::drawForeground(QPainter *painter, const QRectF &rect)
使用 painter 绘制场景的前景,在绘制背景和所有项之后。重新实现此函数以为此视图提供自定义前景。
如果只是想要定义前景的颜色、纹理或渐变,可以调用 setForegroundBrush() 代替。
所有绘制均在 场景 坐标系中进行。rect 是暴露的矩形。
默认实现使用视图的 foregroundBrush 填充 rect。如果没有定义此类画笔(默认),则调用场景的 drawForeground() 函数。
另请参阅drawBackground() 和 QGraphicsScene::drawForeground().
[重写虚保护]
void QGraphicsView::dropEvent(QDropEvent *event)
重新实现: QAbstractScrollArea::dropEvent(QDropEvent *event).
void QGraphicsView::ensureVisible(const QRectF &rect, int xmargin = 50, int ymargin = 50)
将视口的内容滚动,以便将场景矩形 rect 显示出来,其中 xmargin 和 ymargin 以像素为单位指定了边距。如果指定的矩形无法到达,内容将滚动到最近的合法位置。默认边距值均为 50 像素。
另请参阅centerOn().
void QGraphicsView::ensureVisible(qreal x, qreal y, qreal w, qreal h, int xmargin = 50, int ymargin = 50)
这是一个重载函数。
此函数提供便利。它等价于调用ensureVisible(QRectF(x, y, w, h), xmargin, ymargin)。
void QGraphicsView::ensureVisible(const QGraphicsItem *item, int xmargin = 50, int ymargin = 50)
这是一个重载函数。
将视口的内容滚动,以便项目中点中心可见,xmargin 和 ymargin 指定以像素为单位的边距。如果无法达到指定的点,窗口内容将滚动到最近的合法位置。两个边距的默认值均为 50 像素。
另请参阅centerOn().
[覆盖虚拟保护]
bool QGraphicsView::event(QEvent *event)
重新实现: QAbstractScrollArea::event(QEvent *event)。
void QGraphicsView::fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio)
缩放视图矩阵并滚动滚动条,以确保场景矩形 rect 落在视口中。 rect 必须位于场景矩形内;否则,fitInView() 不能保证整个 rect 都可见。
此函数保持视图的旋转、平移或倾斜。视图按 aspectRatioMode 缩放。如果 rect 不贴合,则会在视图中居中对齐。
通常在重新实现resizeEvent()内部调用fitInView(),以确保整个场景或场景的某些部分作为视图缩放时自动缩放到视图的新大小。但请注意,如果在resizeEvent()内部调用fitInView(),则可能会引起不希望的重缩放递归,如果新的变换切换了滚动条的自动状态。可以将滚动条策略切换到始终开启或始终关闭,以避免这种情况(请参阅horizontalScrollBarPolicy() 和 verticalScrollBarPolicy)。
如果 rect 为空或视口过小,则此函数不执行任何操作。
另请参阅setTransform(),ensureVisible() 和 centerOn()。
void QGraphicsView::fitInView(qreal x, qreal y, qreal w, qreal h, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio)
这是一个重载函数。
此便利函数等价于调用fitInView(QRectF(x, y, w, h), aspectRatioMode)。
另请参阅 ensureVisible() 和 centerOn().
void QGraphicsView::fitInView(const QGraphicsItem *item, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio)
这是一个重载函数。
确保 item 在视图中紧密地对应,并根据 aspectRatioMode 进行缩放。
另请参阅 ensureVisible() 和 centerOn().
[override virtual protected]
void QGraphicsView::focusInEvent(QFocusEvent *event)
重实:QWidget::focusInEvent(QFocusEvent *event).
[override virtual protected]
bool QGraphicsView::focusNextPrevChild(bool next)
重实:QWidget::focusNextPrevChild(bool next).
[override virtual protected]
void QGraphicsView::focusOutEvent(QFocusEvent *event)
重实:QWidget::focusOutEvent(QFocusEvent *event).
[override virtual protected]
void QGraphicsView::inputMethodEvent(QInputMethodEvent *event)
重实:QWidget::inputMethodEvent(QInputMethodEvent *event).
[override virtual]
QVariant QGraphicsView::inputMethodQuery(Qt::InputMethodQuery query) const
重实:QWidget::inputMethodQuery(Qt::InputMethodQuery query) const.
[slot]
void QGraphicsView::invalidateScene(const QRectF &rect = QRectF(), QGraphicsScene::SceneLayers layers = QGraphicsScene::AllLayers)
使 layers 在 rect 内无效并安排重新绘制。 rect 是在场景坐标中的。对 rect 内的 layers 内的任何缓存内容无条件地使无效并重新绘制。
您可以通过调用此函数来通知 QGraphicsView 场景的背景或前景发生了变化。它通常用于具有基于瓦片的背景的场景,当 QGraphicsView 启用背景缓存时通知变化。
注意,目前 QGraphicsView 只支持背景缓存(请参阅 QGraphicsView::CacheBackground)。如果传入了所有层以外的任何层,此函数等同于调用 update()。
另请参阅 QGraphicsScene::invalidate() 和 update()。
bool QGraphicsView::isTransformed() const
如果视图中已应用了转换(即被分配了非单位转换,或已调整滚动条),则返回 true
。
另请参阅 setTransform(),horizontalScrollBar() 和 verticalScrollBar().
QGraphicsItem *QGraphicsView::itemAt(const QPoint &pos) const
返回位置 pos 的项,该位置在视图坐标系中。如果有多个项在该位置,此函数返回最顶部的项。
示例
void CustomView::mousePressEvent(QMouseEvent *event) { if (QGraphicsItem *item = itemAt(event->pos())) { qDebug() << "You clicked on item" << item; } else { qDebug("You didn't click on an item."); } }
QGraphicsItem *QGraphicsView::itemAt(int x, int y) const
这是一个重载函数。
此函数提供方便。相当于调用 itemAt(QPoint(x, y))。
QList<QGraphicsItem *> QGraphicsView::items() const
返回与关联场景中所有项的列表,按降序堆叠顺序(即返回列表中的第一个项是最顶部的项)。
请参阅 QGraphicsScene::items() 和 排序。
QList<QGraphicsItem *> QGraphicsView::items(const QPoint &pos) const
返回在视图中位置 pos 的所有项的列表。这些项按降序堆叠顺序列出(即列表中的第一个项是最顶部的项,最后一个项是最底部的项)。pos 在视口坐标系中。
此函数通常从在 QGraphicsView 的子类中处理的鼠标事件处理程序内部调用。pos 在未变换的视口坐标系中,就像 QMouseEvent::pos()。
void CustomView::mousePressEvent(QMouseEvent *event) { qDebug() << "There are" << items(event->pos()).size() << "items at position" << mapToScene(event->pos()); }
请参阅 QGraphicsScene::items() 和 排序。
QList<QGraphicsItem *> QGraphicsView::items(int x, int y) const
此函数提供方便。相当于调用 items(QPoint(x, y))。
QList<QGraphicsItem *> QGraphicsView::items(const QRect &rect, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
这是一个重载函数。
根据 mode,返回包含或与 rect 相交的所有项的列表。rect 在视口坐标系中。
mode 的默认值是 Qt::IntersectsItemShape;返回所有与或包含 rect 的形状相交的项。
这些项按降序堆叠顺序排序(即返回列表中的第一个项是最顶部的项)。
请参阅 itemAt(),items(),mapToScene(),以及 排序。
QList<QGraphicsItem *> QGraphicsView::items(int x, int y, int w, int h, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
此便捷函数等价于调用 items(QRectF(x, y, w, h), mode)。
QList<QGraphicsItem *> QGraphicsView::items(const QPolygon &polygon, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
这是一个重载函数。
返回一个项目列表,这些项目根据 mode 的设置,可能包含或与 polygon 交叉。 polygon 以视口坐标表示。
mode 的默认值是 Qt::IntersectsItemShape;所有与 polygon 精确形状相交或包含 polygon 的项目均返回。
项目按降序堆叠顺序进行排序(即,返回列表中的第一个项目是最上面的项目)。
请参阅 itemAt(),items(),mapToScene(),以及 排序。
QList<QGraphicsItem *> QGraphicsView::items(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
这是一个重载函数。
返回一个项目列表,这些项目根据 mode 的设置,可能包含或与 path 交叉。 path 以视口坐标表示。
mode 的默认值是 Qt::IntersectsItemShape;所有与 path 精确形状相交或包含 path 的项目均返回。
请参阅 itemAt(),items(),mapToScene(),以及 排序。
[覆盖虚保护]
void QGraphicsView::keyPressEvent(QKeyEvent *event)
重实现: QAbstractScrollArea::keyPressEvent(QKeyEvent *e)。
[覆盖虚保护]
void QGraphicsView::keyReleaseEvent(QKeyEvent *event)
重实现: QWidget::keyReleaseEvent(QKeyEvent *event)。
QPoint QGraphicsView::mapFromScene(const QPointF &point) const
将场景坐标 point 转换为视口坐标。
另请参阅mapToScene。
QPolygon QGraphicsView::mapFromScene(const QRectF &rect) const
将场景矩形 rect 转换为一个视口坐标多边形。
另请参阅mapToScene。
QPolygon QGraphicsView::mapFromScene(const QPolygonF &polygon) const
将场景坐标多边形 polygon 转换为一个视口坐标多边形。
另请参阅mapToScene。
QPainterPath QGraphicsView::mapFromScene(const QPainterPath &path) const
返回场景坐标画家路径(path)到视口坐标画家路径。
另请参阅mapToScene。
QPoint QGraphicsView::mapFromScene(qreal x, qreal y) const
此函数提供方便。它与调用 mapFromScene(QPointF(x, y))) 等价。
QPolygon QGraphicsView::mapFromScene(qreal x, qreal y, qreal w, qreal h) const
此函数提供方便。它与调用 mapFromScene(QRectF(x, y, w, h))) 等价。
QPointF QGraphicsView::mapToScene(const QPoint &point) const
返回被映射到场景坐标的点(point)的视口坐标。
注意:将点(point)所在的像素覆盖的整个矩形映射到场景坐标可能很有用,而不是点本身。为此,您可以调用 mapToScene(QRect(point, QSize(2, 2))))。
另请参阅mapFromScene。
QPolygonF QGraphicsView::mapToScene(const QRect &rect) const
返回被映射到场景坐标多边形的视口矩形(rect)。
另请参阅mapFromScene。
QPolygonF QGraphicsView::mapToScene(const QPolygon &polygon) const
返回被映射到场景坐标多边形的视口多边形(polygon)。
另请参阅mapFromScene。
QPainterPath QGraphicsView::mapToScene(const QPainterPath &path) const
返回被映射到场景坐标画家路径的视口画家路径(path)。
另请参阅mapFromScene。
QPointF QGraphicsView::mapToScene(int x, int y) const
此函数提供方便。它与调用 mapToScene(QPoint(x, y))) 等价。
QPolygonF QGraphicsView::mapToScene(int x, int y, int w, int h) const
此函数提供方便。它与调用 mapToScene(QRect(x, y, w, h))) 等价。
[重写虚受保护]
void QGraphicsView::mouseDoubleClickEvent(QMouseEvent *event)
重新实现: QAbstractScrollArea::mouseDoubleClickEvent(QMouseEvent *e)
[覆盖虚受保护]
void QGraphicsView::mouseMoveEvent(QMouseEvent *event)
重新实现: QAbstractScrollArea::mouseMoveEvent(QMouseEvent *e)
[覆盖虚受保护]
void QGraphicsView::mousePressEvent(QMouseEvent *event)
重新实现: QAbstractScrollArea::mousePressEvent(QMouseEvent *e)
[覆盖虚受保护]
void QGraphicsView::mouseReleaseEvent(QMouseEvent *event)
重新实现: QAbstractScrollArea::mouseReleaseEvent(QMouseEvent *e)
[覆盖虚受保护]
void QGraphicsView::paintEvent(QPaintEvent *event)
重新实现: QAbstractScrollArea::paintEvent(QPaintEvent *event)
void QGraphicsView::render(QPainter *painter, const QRectF &target = QRectF(), const QRect &source = QRect(), Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio)
将场景中的源矩形(以视图坐标表示)渲染到目标矩形,该目标矩形以绘图设备坐标表示,使用painter。此函数对于将视图的内容捕获到绘图设备,例如 QImage(例如,进行屏幕截图),或用于打印到 QPrinter 非常有用。例如:
QGraphicsScene scene; scene.addItem(... ... QGraphicsView view(&scene); view.show(); ... QPrinter printer(QPrinter::HighResolution); printer.setPageSize(QPrinter::A4); QPainter painter(&printer); // print, fitting the viewport contents into a full page view.render(&painter); // print the upper half of the viewport into the lower. // half of the page. QRect viewport = view.viewport()->rect(); view.render(&painter, QRectF(0, printer.height() / 2, printer.width(), printer.height() / 2), viewport.adjusted(0, 0, 0, -viewport.height() / 2));
如果 source 是空矩形,则此函数将使用 viewport()->rect() 来确定要绘制的内容。如果 target 是空矩形,则将使用 painter 的绘图设备全尺寸(例如,对于 QPrinter,页大小)。
将根据aspectRatioMode将源矩形内容进行转换,以适应目标矩形。默认情况下,保持宽高比,并将source 缩放以适应target。
void QGraphicsView::resetCachedContent()
重置任何缓存内容。调用此函数将清除 QGraphicsView 的缓存。如果当前缓存模式是 CacheNone,则此函数不执行任何操作。
当 backgroundBrush 或 QGraphicsScene::backgroundBrush 属性改变时,会自动为您调用此函数;只有当您已重新实现了 QGraphicsScene::drawBackground() 或 QGraphicsView::drawBackground() 以绘制自定义背景,并且需要触发完整重绘时,才需要调用此函数。
另请参阅cacheMode。
void QGraphicsView::resetTransform()
将视图转换重置为单位矩阵。
另请参阅transform() 和 setTransform().
[重载虚保护]
void QGraphicsView::resizeEvent(QResizeEvent *event)
重新实现: QAbstractScrollArea::resizeEvent(QResizeEvent *event).
void QGraphicsView::rotate(qreal angle)
按顺时针方向旋转当前视图转换 angle 度。
另请参阅setTransform(), transform(), scale(), shear(), 和 translate().
[信号]
void QGraphicsView::rubberBandChanged(QRect rubberBandRect, QPointF fromScenePoint, QPointF toScenePoint)
当橡皮筋矩形发生变化时,会发出此信号。视口矩形由 rubberBandRect 指定。拖动开始位置和拖动结束位置通过 fromScenePoint 和 toScenePoint 提供的场景点提供。
当橡皮筋选择结束时,此信号将使用空值发出。
另请参阅rubberBandRect().
QRect QGraphicsView::rubberBandRect() const
当用户正在使用橡皮筋进行项选择时,此函数将返回当前橡皮筋区域(在视口坐标中)。当用户不使用橡皮筋时,此函数返回(一个空)QRectF()。
请注意,此 QRect 的部分可能位于可视视口之外。例如,它可以包含负值。
另请参阅rubberBandSelectionMode 和 rubberBandChanged().
void QGraphicsView::scale(qreal sx, qreal sy)
按 (sx, sy) 缩放当前视图转换。
另请参阅setTransform(), transform(), rotate(), shear(), 和 translate().
QGraphicsScene *QGraphicsView::scene() const
返回指向在视图中可视化场景的指针。如果没有场景正在可视化中,返回 nullptr
。
另请参阅setScene().
[重载虚保护]
void QGraphicsView::scrollContentsBy(int dx, int dy)
重新实现:QAbstractScrollArea::scrollContentsBy(int dx, int dy).
void QGraphicsView::setOptimizationFlag(QGraphicsView::OptimizationFlag flag, bool enabled = true)
如果 enabled 为真,则启用 flag;否则禁用 flag。
另请参阅 optimizationFlags.
void QGraphicsView::setRenderHint(QPainter::RenderHint hint, bool enabled = true)
如果 enabled 为真,则启用渲染提示 hint;否则禁用 hint。
另请参阅 renderHints.
void QGraphicsView::setScene(QGraphicsScene *scene)
将当前场景设置为 scene。如果 scene 已被查看,则此函数不会执行任何操作。
当在一个视图中设置场景时,QGraphicsScene::changed() 信号将自动连接到此视图的 updateScene() 插槽,并且视图的滚动条将调整以适应场景的大小。
视图不拥有 scene 的所有权。
另请参阅 scene。
void QGraphicsView::setTransform(const QTransform &matrix, bool combine = false)
将视图当前变换矩阵设置为 matrix。
如果 combine 为真,那么 matrix 将与当前矩阵结合;否则,matrix 将替换当前矩阵。默认情况下,combine 为假。
变换矩阵将场景转换为视图坐标。使用默认的变换(单位矩阵提供),视图中的一个像素代表场景中的一个单位(例如,一个 10x10 的矩形项目在视图中使用 10x10 像素绘制)。如果应用了 2x2 的缩放矩阵,则场景将以 1:2 的比例绘制(例如,一个 10x10 的矩形项目将使用 20x20 个像素在视图中绘制)。
示例
QGraphicsScene scene; scene.addText("GraphicsView rotated clockwise"); QGraphicsView view(&scene); view.rotate(90); // the text is rendered with a 90 degree clockwise rotation view.show();
为了简化与变换视图中的项目交互,QGraphicsView 提供了 mapTo... 和 mapFrom... 函数,可以将场景和视图坐标之间进行转换。例如,您可以调用 mapToScene() 将视图坐标映射为一个浮点场景坐标,或者调用 mapFromScene() 将浮点场景坐标映射到视图坐标。
另请参阅 transform(), resetTransform(), rotate(), scale(), shear() 和 translate().
[重载虚保护槽]
void QGraphicsView::setupViewport(QWidget *widget)
重载:QAbstractScrollArea::setupViewport(QWidget *viewport).
该槽在调用QAbstractScrollArea后由setViewport()调用。在QGraphicsView的子类中重新实现此函数,以便在之前使用之前初始化新的视图窗口。
另请参阅 setViewport().
void QGraphicsView::shear(qreal sh, qreal sv)
通过( sh, sv )剪切当前视图变换。
另请参阅 setTransform(), transform(), rotate(), scale() 和 translate().
[重写虚保护]
void QGraphicsView::showEvent(QShowEvent *event)
重写: QWidget::showEvent(QShowEvent *event).
[重写虚]
QSize QGraphicsView::sizeHint() const
重写: QAbstractScrollArea::sizeHint() const.
QTransform QGraphicsView::transform() const
返回视图当前变换矩阵。如果没有设置当前变换,返回单位矩阵。
另请参阅 setTransform(), rotate(), scale(), shear() 和 translate().
void QGraphicsView::translate(qreal dx, qreal dy)
通过( dx, dy )转换当前视图变换。
另请参阅 setTransformtransformrotate() 和 shear().
[插槽]
void QGraphicsView::updateScene(const QList<QRectF> &rects)
计划更新场景矩形 rects。
另请参阅 QGraphicsScene::changed().
[插槽]
void QGraphicsView::updateSceneRect(const QRectF &rect)
通知 QGraphicsView 场景的视图矩形已改变。 rect 是新的视图矩形。如果视图已经设置了一个显式的视图矩形,则此函数不执行任何操作。
另请参阅 sceneRect 和 QGraphicsScene::sceneRectChanged().
[重写虚保护]
bool QGraphicsView::viewportEvent(QEvent *event)
重写: QAbstractScrollArea::viewportEvent(QEvent *event).
QTransform QGraphicsView::viewportTransform() const
返回一个将场景坐标映射到视口坐标的矩阵。
另请参阅 mapToScene() 和 mapFromScene().
[覆盖 虚拟 受保护的]
void QGraphicsView::wheelEvent(QWheelEvent *事件)
重新实现了:QAbstractScrollArea::wheelEvent(QWheelEvent *e).
© 2024 Qt 公司。本文件包含的文档贡献属于各自所有者的版权。本文件提供的文档受《GNU 自由文档许可证 versión 1.3》的许可,由自由软件基金会发布。Qt 及其相关标志是芬兰和/或其他国家的 Qt 公司的商标。所有其他商标均为其各自所有者的财产。