QT QGraphicsView介绍

QT QGraphicsView介绍
版本:Qt 5.14
目录

  1. 介绍
  2. 属性
  3. 公共函数
  4. 设置相关函数
  5. 槽函数
  6. 信号
  7. 事件

1. 介绍

QGraphicsView 是 Qt 中用于显示 QGraphicsScene 中图形项的部件(widget)。它提供了一个视图,允许用户查看和与场景中的图形项进行交互。以下是一些关键特性和用途:

  • 显示图形项QGraphicsView 用于显示 QGraphicsScene 中的图形项,包括图形、文本、图像等。它提供了一个视图窗口,可以在其中查看和操作场景中的图形项。

  • 图形项交互:通过 QGraphicsView,用户可以与场景中的图形项进行交互,例如移动、缩放、选择等操作。这使得在图形用户界面中实现丰富的图形展示和交互成为可能。

  • 视图控制QGraphicsView 提供了一些功能来控制视图的行为,例如平移、缩放、旋转等。用户可以通过这些功能来调整视图中显示的内容。

  • 事件处理QGraphicsView 可以处理各种事件,包括鼠标事件、键盘事件等。通过重写相应的事件处理函数,可以实现对用户输入的响应。

  • 视图转换QGraphicsView 支持视图转换,可以将场景中的逻辑坐标转换为视图中的像素坐标,以便正确显示和交互。

  • 定制化QGraphicsView 允许开发者进行定制化,可以通过子类化 QGraphicsView 并重写相应的函数来实现特定需求,例如自定义绘制、事件处理等。

总的来说,QGraphicsView 是 Qt 中重要的图形视图部件,用于显示和交互 QGraphicsScene 中的图形项。它为开发者提供了丰富的功能和灵活性,使得开发图形用户界面变得更加简单和灵活。

2. 属性

2.1. alignment 对齐方式

 Qt::Alignment  alignment() const

这个属性表示当整个场景在视图中可见时,场景在视图中的对齐方式。

如果整个场景在视图中可见(即没有可见的滚动条),视图的对齐方式将决定场景在视图中的渲染位置。例如,如果对齐方式是Qt::AlignCenter(默认值),场景将在视图中居中显示;如果对齐方式是(Qt::AlignLeft | Qt::AlignTop),场景将在视图的左上角渲染。

通过设置QGraphicsView对象的alignment属性,您可以控制整个场景在视图中的位置对齐。这对于确保场景在视图中以特定对齐方式显示非常有用,提供了更多对图形场景视觉布局的控制。

2.2. backgroundBrush 背景画刷

这个属性保存了场景的背景画刷。

QBrush backgroundBrush() const

这个属性设置了视图中场景的背景画刷。它用于覆盖场景自身的背景,并定义了drawBackground()的行为。如果要为这个视图提供自定义的背景绘制,可以重新实现drawBackground()方法。

默认情况下,这个属性包含一个具有Qt::NoBrush模式的画刷。

2.3. cacheMode 缓存

QGraphicsView::CacheMode cacheMode() const

这个属性保存了视图中哪些部分被缓存。

QGraphicsView可以将预先渲染的内容缓存在QPixmap中,然后绘制到视口上。这种缓存的目的是加快对于渲染速度较慢的区域的总体渲染时间。例如,纹理、渐变和 alpha 混合的背景可能渲染速度较慢,特别是在变换视图的情况下。CacheBackground标志允许缓存视图的背景。

2.4. dragMode 拖拽模式

这个属性保存了在按住鼠标左键拖动时,鼠标在场景上的行为。

这个属性定义了当用户点击场景背景并拖动鼠标时应该发生什么(例如,使用指向手光标滚动视口内容,或使用选框选择多个项)。默认值NoDrag不执行任何操作。

这种行为仅影响未被任何项处理的鼠标点击。您可以通过创建QGraphicsView的子类并重新实现mouseMoveEvent()来定义自定义行为。

2.5. foregroundBrush 前景画刷

QBrush foregroundBrush() const

这个属性保存了场景的前景画刷。

这个属性设置了视图中场景的前景画刷。它用于覆盖场景自身的前景,并定义了drawForeground()的行为。要为这个视图提供自定义的前景绘制,您可以重新实现drawForeground()方法。

默认情况下,这个属性包含一个具有Qt::NoBrush模式的画刷。

2.6. interactive 视图是否允许场景交互

bool isInteractive() const

这个属性保存了视图是否允许与场景进行交互。

如果启用了此属性,视图将允许与场景进行交互。否则,视图将不允许交互,任何鼠标或键盘事件都将被忽略(即,它将作为只读视图)。

默认情况下,这个属性为true。

2.7. optimizationFlags 性能标志

QGraphicsView::OptimizationFlags optimizationFlags() const

以下是可以用来调整QGraphicsView性能的标志:

  1. QGraphicsView::DontClipPainter:禁用绘图器的裁剪。
  2. QGraphicsView::DontSavePainterState:禁用绘图器状态的保存和恢复。
  3. QGraphicsView::DontAdjustForAntialiasing:禁用抗锯齿的调整。
  4. QGraphicsView::IndirectPainting:允许间接绘制,适用于OpenGL渲染。
  5. QGraphicsView::SmartUpdate:智能更新,减少重绘区域。

这些标志可以根据目标平台、场景和视口的使用情况来调整性能。每个标志的效果各不相同,可以查看OptimizationFlags文档以获取详细信息。

默认情况下,没有启用任何优化标志。

2.8. renderHints 渲染提示

QPainter::RenderHints renderHints() const

这个属性保存了视图的默认渲染提示。
这些提示在每个可见项绘制之前用于初始化QPainter。QPainter使用渲染提示来切换渲染特性,比如抗锯齿和平滑的像素图变换。

默认情况下,QPainter::TextAntialiasing是启用的。

2.9. resizeAnchor 如何定位场景

resizeAnchor属性用于指定视图调整大小时,视图应该如何定位场景。具体来说,它决定了当视口部件的大小改变时,场景在视口中的定位方式。

常见的resizeAnchor属性值包括:

  • QGraphicsView::NoAnchor:调整大小时保持场景位置不变,视图的左上角看起来是固定的。
  • QGraphicsView::AnchorViewCenter:将视图中心作为锚点,保持场景在视图中心位置。
  • QGraphicsView::AnchorUnderMouse:将鼠标位置作为锚点,保持鼠标下的场景位置不变。

通过设置不同的resizeAnchor属性值,可以控制视图调整大小时场景的定位方式,从而实现不同的效果。

2.10. rubberBandSelectionMode 橡皮筋选择

Qt::ItemSelectionMode rubberBandSelectionMode() const

rubberBandSelectionMode属性用于设置在使用橡皮筋选择(rubber band selection)时,视图应该如何选择项。

常见的rubberBandSelectionMode属性值包括:

  • Qt::IntersectsItemShape:橡皮筋与项形状相交的项将被选择。
  • Qt::ContainsItemShape:橡皮筋完全包含在项形状内的项将被选择。
  • Qt::IntersectsItemBoundingRect:橡皮筋与项边界矩形相交的项将被选择。
  • Qt::ContainsItemBoundingRect:橡皮筋完全包含在项边界矩形内的项将被选择。

通过设置不同的rubberBandSelectionMode属性值,可以控制橡皮筋选择时选择项的方式,从而满足不同的选择需求。

2.11. sceneRect 场景区域

QRectF sceneRect() const

该属性保存了视图可视化的场景区域。
场景矩形定义了场景的范围,在视图的情况下,这意味着您可以使用滚动条导航的场景区域。
如果未设置或设置了一个空的 QRectF,此属性将具有与 QGraphicsScene::sceneRect 相同的值,并且随着 QGraphicsScene::sceneRect 的更改而更改。否则,视图的场景矩形不受场景的影响。
请注意,尽管场景支持几乎无限的大小,但滚动条的范围永远不会超过一个整数的范围(INT_MIN,INT_MAX)。当场景大于滚动条的值时,您可以选择使用 translate() 来导航场景。
默认情况下,此属性包含一个原点为零宽度和高度的矩形。

2.12. transformationAnchor 变换锚点

QGraphicsView::ViewportAnchor transformationAnchor() const

transformationAnchorQGraphicsView 类中的一个属性,用于设置或获取视图的变换锚点。这个变换锚点定义了视图中的位置,围绕这个点进行缩放和旋转操作。

QGraphicsView 中,transformationAnchor 属性通常用于以下目的:

  1. 定义变换中心transformationAnchor 确定了视图中的位置,围绕这个点进行缩放和旋转操作。当对视图进行缩放或旋转时,视图会围绕这个锚点进行变换。

  2. 控制变换效果:通过设置不同的变换锚点,可以实现不同的视图变换效果。例如,将变换锚点设置为视图中心可以使缩放和旋转围绕视图中心进行。

  3. 自定义视图行为:根据需要,您可以根据应用程序的要求设置不同的变换锚点,以实现特定的视图行为和用户体验。

通过设置 transformationAnchor 属性,您可以控制视图变换的中心点,从而影响视图的缩放和旋转行为。这可以帮助您实现定制的视图效果和交互体验。

2.13. viewportUpdateMode 视口更新模式

viewportUpdateModeQGraphicsView 类中的一个属性,用于设置视图的视口更新模式。视口是指用于显示场景内容的窗口部分,而视口更新模式则控制在何种情况下视口会被更新。

QGraphicsView 中,viewportUpdateMode 属性通常用于以下目的:

  1. 控制视口更新viewportUpdateMode 属性允许您指定何时以及如何更新视图的视口。不同的模式可以影响视图的性能和显示效果。

  2. 优化视图更新:通过选择合适的更新模式,可以优化视图的更新过程,减少不必要的重绘操作,提高性能。

  3. 定制视图行为:根据应用程序的需求,您可以根据具体情况选择合适的更新模式,以实现特定的视图行为和用户体验。

一些常见的 viewportUpdateMode 模式包括:

  • MinimalViewportUpdate:在最小范围内更新视口,以减少重绘操作。
  • BoundingRectViewportUpdate:基于场景中物体的边界矩形更新视口。
  • SmartViewportUpdate:智能更新模式,根据需要更新视口,以平衡性能和显示效果。

通过设置 viewportUpdateMode 属性,您可以控制视图的更新方式,以实现更高效的视图更新和更好的用户体验。根据应用程序的需求和性能要求,选择合适的更新模式非常重要。

3. 公共函数

3.1. QGraphicsView 构造函数

原型

QGraphicsView::QGraphicsView(QGraphicsScene *scene, QWidget *parent = nullptr)
QGraphicsView::QGraphicsView(QWidget *parent = nullptr)

介绍
QGraphicsView::QGraphicsViewQGraphicsView 类的构造函数,用于创建一个 QGraphicsView 视图对象,并将其与指定的 QGraphicsScene 场景关联起来。

参数说明

  • scene:指向 QGraphicsScene 场景对象的指针,用于指定与视图关联的场景。
  • parent:可选参数,表示视图的父部件。默认值为 nullptr,表示没有父部件。

完整示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    
    // 在场景中添加一个矩形项
    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    return app.exec();
}

这个示例演示了如何使用 QGraphicsView::QGraphicsView 构造函数创建一个 QGraphicsView 视图对象,并将其与一个包含矩形项的 QGraphicsScene 场景关联起来。最后,通过显示视图,您可以看到场景中的矩形项显示在视图中。

3.2.~QGraphicsView 析构函数

QGraphicsView::~QGraphicsViewQGraphicsView 类的析构函数。析构函数在对象被销毁时调用,用于执行对象的清理工作,释放资源,以及执行其他必要的操作。

对于 QGraphicsView 类,析构函数通常用于清理与视图对象相关的资源,例如清理视图的状态、删除相关的对象等。在大多数情况下,您不需要显式调用析构函数,因为它会在对象超出范围时自动调用。

QGraphicsView 类中,析构函数的实现通常由 Qt 框架提供,您无需自己编写析构函数来清理视图对象。

如果您有特定的清理需求或者需要在视图对象被销毁时执行特定的操作,您可以通过继承 QGraphicsView 类并重写析构函数来实现这些行为。

3.3. centerOn 中心对齐

QGraphicsView::centerOnQGraphicsView 类的一个成员函数,用于将视图中心对齐到给定的场景坐标点。这可以用于在视图中居中显示特定的场景项或位置。
原型

void QGraphicsView::centerOn(const QPointF &pos)
void QGraphicsView::centerOn(qreal x, qreal y)
void QGraphicsView::centerOn(const QGraphicsItem *item)

参数说明

  • pos:一个 QPointF 类型的对象,表示要在视图中心对齐的场景坐标点。
  • item:一个 QGraphicsItem 类型的对象,表示要在视图中心对齐的图形项。

示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    
    // 在场景中添加一个矩形项
    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 将视图中心对齐到场景中的矩形项
    view.centerOn(rect);

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并将其与一个包含矩形项的 QGraphicsScene 场景关联。然后,我们使用 centerOn 函数将视图的中心对齐到场景中的矩形项,以便确保该矩形项位于视图的中心位置。

3.4.ensureVisible 特定区域可见

原型

void QGraphicsView::ensureVisible(const QRectF &rect, int xmargin = 50, int ymargin = 50)
void QGraphicsView::ensureVisible(qreal x, qreal y, qreal w, qreal h, int xmargin = 50, int ymargin = 50)
void QGraphicsView::ensureVisible(const QGraphicsItem *item, int xmargin = 50, int ymargin = 50)

介绍
QGraphicsView::ensureVisibleQGraphicsView 类的一个成员函数,用于确保特定的区域在视图中可见,并根据需要调整视图的滚动条位置。

参数说明

  • rect:一个 QRectF 类型的对象,表示要确保可见的区域。
  • xmargin:水平方向的边距,用于指定在水平方向上额外展示的区域大小。
  • ymargin:垂直方向的边距,用于指定在垂直方向上额外展示的区域大小。

完整示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    
    // 在场景中添加一个矩形项
    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 创建一个矩形区域
    QRectF visibleRect(50, 50, 200, 200);

    // 确保视图中可见指定的矩形区域
    view.ensureVisible(visibleRect, 50, 50);

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并将其与一个包含矩形项的 QGraphicsScene 场景关联。然后,我们使用 ensureVisible 函数确保指定的矩形区域在视图中可见,并通过设置边距参数来调整视图的展示范围。

3.5. fitInView 区域完全可视化

QGraphicsView::fitInViewQGraphicsView 类的一个成员函数,用于将指定的矩形区域适应视图窗口的大小,并根据需要调整视图的缩放级别以确保整个区域可见。

原型

void QGraphicsView::fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio)

参数说明

  • rect:一个 QRectF 类型的对象,表示要适应视图的矩形区域。
  • aspectRatioMode:一个 Qt::AspectRatioMode 枚举类型的参数,表示缩放时保持的纵横比模式,默认值为 Qt::KeepAspectRatio

示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    
    // 在场景中添加一个矩形项
    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 创建一个矩形区域
    QRectF fitRect(0, 0, 200, 200);

    // 将指定的矩形区域适应视图窗口的大小
    view.fitInView(fitRect, Qt::KeepAspectRatio);

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并将其与一个包含矩形项的 QGraphicsScene 场景关联。然后,我们使用 fitInView 函数将指定的矩形区域适应视图窗口的大小,并保持纵横比例不变,以确保整个区域可见。

3.6. itemAt 获取坐标位置的图形项

QGraphicsView::itemAtQGraphicsView 类的一个成员函数,用于返回给定视图坐标下的图形项。如果在指定位置下没有图形项,则返回空指针。

原型

QGraphicsItem *QGraphicsView::itemAt(const QPoint &pos) const
QGraphicsItem *QGraphicsView::itemAt(int x, int y) const

参数说明

  • pos:一个 QPoint 类型的对象,表示视图坐标下的位置。

返回值

  • QGraphicsItem * 如果在给定位置下存在图形项,则返回该图形项的指针;如果不存在,则返回空指针。

示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    
    // 在场景中添加一个矩形项
    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 在视图坐标 (50, 50) 的位置查找场景项
    QGraphicsItem *item = view.itemAt(QPoint(50, 50));

    if (item) {
        qDebug() << "Found item at position (50, 50)";
    } else {
        qDebug() << "No item found at position (50, 50)";
    }

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并将其与一个包含矩形项的 QGraphicsScene 场景关联。然后,我们使用 itemAt 函数在视图坐标 (50, 50) 的位置查找场景项。如果在该位置下存在场景项,则输出相应的信息;否则输出未找到信息。

3.7. items 获取视图中的图形项

QGraphicsView::items()QGraphicsView 类的一个成员函数,用于返回视图中所有可见的场景项。

原型

QList<QGraphicsItem *> QGraphicsView::items(Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
QList<QGraphicsItem *> QGraphicsView::items(const QPoint &pos) const
QList<QGraphicsItem *> QGraphicsView::items(int x, int y) const
QList<QGraphicsItem *> QGraphicsView::items(const QRect &rect, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
QList<QGraphicsItem *> QGraphicsView::items(int x, int y, int w, int h, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape)
QList<QGraphicsItem *> QGraphicsView::items(const QPolygon &polygon, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const
QList<QGraphicsItem *> QGraphicsView::items(const QPainterPath &path, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const

参数说明

  • mode:一个 Qt::ItemSelectionMode 枚举类型的参数,表示选择场景项的模式,默认为 Qt::IntersectsItemShape,表示与项形状相交的模式。

返回值

  • 返回一个 QList<QGraphicsItem *> 类型的列表,包含视图中所有可见的场景项。

示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    
    // 在场景中添加多个矩形项
    QGraphicsRectItem *rect1 = scene.addRect(0, 0, 100, 100);
    QGraphicsRectItem *rect2 = scene.addRect(150, 150, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 获取视图中所有可见的场景项
    QList<QGraphicsItem *> items = view.items();

    qDebug() << "Number of visible items in the view: " << items.size();

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并将其与一个包含多个矩形项的 QGraphicsScene 场景关联。然后,我们使用 items() 函数获取视图中所有可见的场景项,并输出可见项的数量。

3.8. mapFromScene 场景坐标映射到视图

mapFromSceneQGraphicsView 类的一个成员函数,用于将场景坐标映射到视图坐标。

原型

QPointF QGraphicsView::mapFromScene(const QPointF &point) const
QPolygon QGraphicsView::mapFromScene(const QRectF &rect) const
QPolygon QGraphicsView::mapFromScene(const QPolygonF &polygon) const
QPainterPath QGraphicsView::mapFromScene(const QPainterPath &path) const
QPoint QGraphicsView::mapFromScene(qreal x, qreal y) const
QPolygon QGraphicsView::mapFromScene(qreal x, qreal y, qreal w, qreal h) const

参数说明
以第一为例:

  • point:一个 QPointF 类型的对象,表示场景中的点坐标。

返回值

  • 返回一个 QPointF 类型的对象,表示转换后的视图坐标。

示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    
    // 在场景中添加一个矩形项
    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 获取矩形项的场景坐标
    QPointF scenePoint = rect->scenePos();

    // 将场景坐标映射到视图坐标
    QPointF viewPoint = view.mapFromScene(scenePoint);

    qDebug() << "Scene Point: " << scenePoint;
    qDebug() << "View Point: " << viewPoint;

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并将其与一个包含一个矩形项的 QGraphicsScene 场景关联。然后,我们获取矩形项的场景坐标,使用 mapFromScene 函数将其映射到视图坐标,并输出转换前后的坐标值。

3.9. mapToScene

mapToSceneQGraphicsView 类的一个成员函数,用于将视图坐标映射到场景坐标。

原型

QPointF QGraphicsView::mapToScene(const QPointF &point) const
QPolygonF QGraphicsView::mapToScene(const QRect &rect) const
QPolygonF QGraphicsView::mapToScene(const QPolygon &polygon) const
QPainterPath QGraphicsView::mapToScene(const QPainterPath &path) const
QPointF QGraphicsView::mapToScene(int x, int y) const
QPolygonF QGraphicsView::mapToScene(int x, int y, int w, int h) const

参数说明

  • point:一个 QPointF 类型的对象,表示视图中的点坐标。

返回值

  • 返回一个 QPointF 类型的对象,表示转换后的场景坐标。

示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    
    // 在场景中添加一个矩形项
    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 获取视图中的点坐标
    QPointF viewPoint(50, 50);

    // 将视图坐标映射到场景坐标
    QPointF scenePoint = view.mapToScene(viewPoint);

    qDebug() << "View Point: " << viewPoint;
    qDebug() << "Scene Point: " << scenePoint;

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并将其与一个包含一个矩形项的 QGraphicsScene 场景关联。然后,我们获取视图中的点坐标,使用 mapToScene 函数将其映射到场景坐标,并输出转换前后的坐标值。

3.10.matrix() 获取视图的变化矩阵

QGraphicsView::matrix()QGraphicsView 类的一个成员函数,用于返回视图的变换矩阵。这个变换矩阵描述了视图坐标系统与场景坐标系统之间的转换关系。

原型

QMatrix QGraphicsView::matrix() const

返回值

  • 返回一个 QMatrix 类型的对象,表示视图的变换矩阵。

示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    
    // 在场景中添加一个矩形项
    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 获取视图的变换矩阵
    QMatrix matrix = view.matrix();

    qDebug() << "View Matrix: " << matrix;

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并将其与一个包含一个矩形项的 QGraphicsScene 场景关联。然后,我们使用 matrix() 函数获取视图的变换矩阵,并输出该变换矩阵的信息。这个变换矩阵描述了视图坐标系统与场景坐标系统之间的转换关系。

3.11. render 内容渲染

renderQGraphicsView 类的一个成员函数,用于在视图中渲染内容。这个函数可以用于将视图中的内容渲染到一个 QPainter 对象中,也可以用于将视图中的内容渲染到一个图像文件中。

原型

void QGraphicsView::render(QPainter *painter, const QRectF &target = QRectF(), const QRect &source = QRect(), Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio)

参数说明

  • painter:一个 QPainter 对象,用于渲染视图中的内容。
  • target:一个 QRectF 对象,表示渲染的目标矩形区域,默认为视图的矩形区域。
  • source:一个 QRect 对象,表示视图中需要渲染的源矩形区域,默认为空矩形,表示整个视图区域。
  • aspectRatioMode:一个 Qt::AspectRatioMode 枚举值,表示如何处理源矩形区域和目标矩形区域的宽高比例,默认为 Qt::KeepAspectRatio

示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QApplication>
#include <QPainter>
#include <QImage>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    
    // 在场景中添加一个矩形项
    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 创建一个 QImage 对象,用于存储渲染后的图像
    QImage image(view.size(), QImage::Format_ARGB32);
    image.fill(Qt::white);

    // 创建一个 QPainter 对象,用于渲染到图像中
    QPainter imagePainter(&image);

    // 渲染视图内容到图像中
    view.render(&imagePainter);

    // 保存图像到文件
    image.save("rendered_image.png");

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并将其与一个包含一个矩形项的 QGraphicsScene 场景关联。然后,我们创建了一个 QImage 对象,用于存储渲染后的图像,并创建一个 QPainter 对象,用于渲染到这个图像中。最后,我们使用 render 函数将视图内容渲染到这个图像中,并将图像保存到文件中。

3.12. resetCachedContent() 重置缓存

resetCachedContent()QGraphicsView 类的一个成员函数,用于重置视图中的缓存内容。当视图中的内容发生变化时,有时候需要手动调用这个函数来清除之前缓存的内容,以确保显示的内容是最新的。

原型

void QGraphicsView::resetCachedContent()

示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    
    // 在场景中添加一个矩形项
    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 修改场景中矩形项的位置
    rect->setPos(50, 50);

    // 在修改内容后重置视图的缓存内容
    view.resetCachedContent();

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并将其与一个包含一个矩形项的 QGraphicsScene 场景关联。然后,我们修改了场景中矩形项的位置,接着调用 resetCachedContent() 函数来重置视图的缓存内容,以确保显示的内容是更新后的内容。

3.13. resetMatrix() 重置为单位矩阵

resetMatrix()QGraphicsView 类的一个成员函数,用于重置视图的变换矩阵为单位矩阵,即将视图的变换效果还原到默认状态。

原型

void QGraphicsView::resetMatrix()

示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    
    // 在场景中添加一个矩形项
    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 进行一些视图变换,比如缩放和平移
    view.scale(2, 2);
    view.translate(50, 50);

    // 重置视图的变换矩阵为单位矩阵
    view.resetMatrix();

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并将其与一个包含一个矩形项的 QGraphicsScene 场景关联。然后,我们对视图进行了一些变换,比如缩放和平移操作。最后,我们调用 resetMatrix() 函数来将视图的变换矩阵重置为单位矩阵,以将视图的变换效果还原到默认状态。

3.14. resetTransform() 还原为默认状态

resetTransform()QGraphicsView 类的一个成员函数,用于将视图的当前变换重置为单位变换,即将视图的缩放、旋转和平移效果还原为默认状态。

原型

void QGraphicsView::resetTransform()

示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    
    // 在场景中添加一个矩形项
    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 进行一些视图变换,比如缩放和平移
    view.scale(2, 2);
    view.rotate(45);

    // 重置视图的变换为单位变换
    view.resetTransform();

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并将其与一个包含一个矩形项的 QGraphicsScene 场景关联。然后,我们对视图进行了一些变换,比如缩放和旋转操作。最后,我们调用 resetTransform() 函数来将视图的当前变换重置为单位变换,以将视图的缩放、旋转和平移效果还原为默认状态。

3.15. rotate() 旋转图形项

rotate()QGraphicsView 类的一个成员函数,用于在视图中应用旋转变换。该函数可以让你在视图中对场景中的图形项进行旋转操作。

原型

void QGraphicsView::rotate(qreal angle)

参数

  • angle 参数表示要应用的旋转角度,以度为单位。

示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    
    // 在场景中添加一个矩形项
    QGraphicsRectItem *rect = scene.addRect(0, 0, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 在视图中对场景中的图形项进行旋转操作
    view.rotate(45);

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并将其与一个包含一个矩形项的 QGraphicsScene 场景关联。然后,我们使用 rotate() 函数对视图进行了旋转操作,将场景中的图形项旋转了45度。

3.16. rubberBandRect() 获取当前橡皮筋选择框的矩形区域

它用于获取当前的橡皮筋选择框的矩形区域。

原型

QRect QGraphicsView::rubberBandRect() const

参数

  • 返回一个 QRect 对象,表示当前橡皮筋选择框的矩形区域。

示例

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QApplication>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    
    // 在场景中添加一些矩形项
    scene.addRect(0, 0, 100, 100);
    scene.addRect(150, 0, 100, 100);
    scene.addRect(0, 150, 100, 100);
    scene.addRect(150, 150, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 在这里可以进行一些交互操作,比如使用橡皮筋选择框选择图形项

    // 获取当前橡皮筋选择框的矩形区域
    QRect rubberBandRect = view.rubberBandRect();
    
    // 打印橡皮筋选择框的矩形区域信息
    qDebug() << "Rubber Band Rect: " << rubberBandRect;

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并将其与一个包含多个矩形项的 QGraphicsScene 场景关联。在交互操作中,您可以使用橡皮筋选择框选择图形项,然后通过调用 rubberBandRect() 函数来获取当前橡皮筋选择框的矩形区域,并打印出来。

3.17 scale() 缩放

函数介绍
QGraphicsView::scale() 函数用于在 QGraphicsView 视图中进行缩放操作。

原型

void QGraphicsView::scale(qreal sx, qreal sy)

参数说明

  • sx:水平方向的缩放因子。
  • sy:垂直方向的缩放因子。

完整示例
下面是一个完整示例,演示如何使用 scale() 函数来缩放 QGraphicsView 视图中的内容:

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;

    // 在场景中添加一个矩形项
    QGraphicsRectItem *rectItem = scene.addRect(0, 0, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Scaling Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 缩放视图内容
    view.scale(2.0, 2.0); // 将视图内容沿水平和垂直方向放大两倍

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并在场景中添加了一个矩形项。然后,我们调用 scale(2.0, 2.0) 来将视图内容沿着水平和垂直方向放大两倍。您可以根据需要调整缩放因子来实现不同的缩放效果。

3.18. scene() 获取与视图相关的场景

函数介绍
QGraphicsView::scene() 函数用于获取与 QGraphicsView 相关联的场景 (QGraphicsScene) 对象。

原型

QGraphicsScene *QGraphicsView::scene() const

返回值

  • 返回与 QGraphicsView 相关联的 QGraphicsScene 场景对象指针。

完整示例
下面是一个示例,演示如何使用 scene() 函数来获取 QGraphicsView 关联的场景对象:

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;

    // 在场景中添加一个矩形项
    QGraphicsRectItem *rectItem = scene.addRect(0, 0, 100, 100);

    // 创建一个 QGraphicsView 视图,并将其与场景关联
    QGraphicsView view(&scene);

    // 设置视图的标题
    view.setWindowTitle("QGraphicsView Scene Example");

    // 设置视图大小
    view.resize(400, 300);

    // 显示视图
    view.show();

    // 获取与视图关联的场景对象
    QGraphicsScene *viewScene = view.scene();
    if (viewScene) {
        qDebug() << "Scene width: " << viewScene->width();
        qDebug() << "Scene height: " << viewScene->height();
    }

    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 视图对象,并在场景中添加了一个矩形项。然后,我们调用 scene() 函数来获取与视图关联的场景对象,并打印出场景的宽度和高度。您可以根据需要进一步操作获取的场景对象。

3.19. transform

3.20. transform() 返回视图的当前转换矩阵

返回视图的当前转换矩阵。如果没有设置当前转换,则返回单位矩阵。

原型:

QTransform QGraphicsView::transform() const

返回值:
返回当前视图的变换矩阵,类型为 QTransform

完整示例:

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QTransform>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    scene.addText("Hello, QGraphicsView!");

    // 创建一个视图,并设置场景
    QGraphicsView view(&scene);
    view.show();

    // 获取当前视图的变换矩阵
    QTransform currentTransform = view.transform();

    // 在控制台输出变换矩阵的值
    qDebug() << "Current Transform Matrix:";
    qDebug() << currentTransform;

    return app.exec();
}

在这个示例中,我们创建了一个简单的 Qt 应用程序,包括一个场景和一个视图。我们使用 QGraphicsView::transform() 函数获取当前视图的变换矩阵,并在控制台输出该变换矩阵的值。您可以根据需要对这个变换矩阵进行操作或者进一步处理。

3.21 translate() 平移操作

用于在视图中进行平移操作。通过指定在 x 和 y 轴上的平移量,可以将视图中的内容沿着指定的方向移动。这对于实现用户交互中的平移效果或者程序化地移动视图内容非常有用。

原型:

void QGraphicsView::translate(qreal dx, qreal dy)

参数说明:

  • dx:在 x 轴上的平移量。
  • dy:在 y 轴上的平移量。

返回值:
该函数没有返回值。

完整示例:

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QTransform>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    scene.addText("Hello, QGraphicsView!");

    // 创建一个视图,并设置场景
    QGraphicsView view(&scene);
    view.show();

    // 在 x 和 y 轴上分别平移 50 个单位
    view.translate(50, 50);

    return app.exec();
}

在这个示例中,我们创建了一个简单的 Qt 应用程序,包括一个场景和一个视图。我们使用 QGraphicsView::translate() 函数在 x 和 y 轴上分别平移了 50 个单位。这会将视图中的内容沿着指定的方向移动。

3.22 viewportTransform() 获取视图的视口变换

介绍:
QGraphicsView::viewportTransform() 函数返回一个 QTransform 对象,该对象表示视图的视口变换。视口变换定义了视图坐标到视口像素坐标的映射,可以用于在视图中进行坐标变换操作。
原型:

QTransform QGraphicsView::viewportTransform() const

返回值:
返回一个 QTransform 对象,表示视图的视口变换。

示例:

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QDebug>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 创建一个场景
    QGraphicsScene scene;
    scene.addText("Hello, QGraphicsView!");

    // 创建一个视图,并设置场景
    QGraphicsView view(&scene);
    view.show();

    // 获取视图的视口变换
    QTransform transform = view.viewportTransform();

    // 输出视口变换矩阵
    qDebug() << "Viewport Transform Matrix:";
    qDebug() << transform;

    return app.exec();
}

在这个示例中,我们演示了如何使用 QGraphicsView::viewportTransform() 函数来获取视图的视口变换,并输出其变换矩阵。视口变换矩阵描述了视图坐标到视口像素坐标的映射关系。

4. 设置相关的函数

4.1. setAlignment 设置对其方式

void setAlignment(Qt::Alignment alignment)

在 Qt 中,Qt::AlignmentFlag 是一个枚举类型,用于指定对象或控件在其父对象中的对齐方式。这个枚举类型包含了多个常量,每个常量代表一种对齐方式。您可以将这些常量组合在一起以实现多种对齐效果。

常见的 Qt::AlignmentFlag 常量包括:

  • Qt::AlignLeft: 左对齐
  • Qt::AlignRight: 右对齐
  • Qt::AlignHCenter: 水平居中
  • Qt::AlignTop: 顶部对齐
  • Qt::AlignBottom: 底部对齐
  • Qt::AlignVCenter: 垂直居中

您可以使用这些常量来设置对象或控件的对齐方式。

4.2. setBackgroundBrush 设置背景画刷

void setBackgroundBrush(const QBrush &brush)

4.3. setCacheMode 设置缓存模式

void setCacheMode(QGraphicsView::CacheMode mode)

在 Qt 中,QGraphicsView::CacheMode 是一个枚举类型,用于指定 QGraphicsView 类中的缓存模式。缓存模式可以影响视图的性能和渲染方式。

QGraphicsView::CacheMode 包含以下常量:

  • QGraphicsView::CacheNone: 不使用缓存。每次需要重新绘制视图时都会重新计算和绘制。

  • QGraphicsView::CacheBackground: 只缓存视图的背景。前景对象每次需要重新绘制时都会重新计算和绘制,但背景会被缓存起来,提高性能。

  • QGraphicsView::CachePainter: 使用一个绘画器(painter)来缓存视图的内容。这种模式可以提高性能,尤其是在需要频繁重绘的情况下。

  • QGraphicsView::CacheAll: 缓存整个视图的内容,包括前景和背景。这种模式在需要频繁重绘整个视图时可以提高性能。

您可以通过调用 QGraphicsView 对象的 setCacheMode 函数来设置缓存模式。例如:

QGraphicsView *view = new QGraphicsView;
view->setCacheMode(QGraphicsView::CacheBackground);

在这个示例中,我们创建了一个 QGraphicsView 对象,并将其缓存模式设置为仅缓存背景。根据您的应用程序的需求和性能要求,您可以根据情况选择合适的缓存模式。

请注意,缓存模式的选择可能会影响性能和内存占用,因此建议根据具体情况进行测试和优化。

4.4. setDragMode 设置拖拽模式

void setDragMode(QGraphicsView::DragMode mode)

在 Qt 中,QGraphicsView::DragMode 是一个枚举类型,用于指定 QGraphicsView 类中的拖拽模式。拖拽模式定义了用户在 QGraphicsView 中拖拽操作的行为。

QGraphicsView::DragMode 包含以下常量:

  • QGraphicsView::NoDrag: 禁用拖拽操作。

  • QGraphicsView::ScrollHandDrag: 当鼠标按下并拖动时,视图会平移,类似于手指在屏幕上拖动移动视图的操作。

  • QGraphicsView::RubberBandDrag: 当鼠标按下并拖动时,会创建一个橡皮筋矩形框,选择视图中的项目。

您可以通过调用 QGraphicsView 对象的 setDragMode 函数来设置拖拽模式。例如:

QGraphicsView *view = new QGraphicsView;
view->setDragMode(QGraphicsView::ScrollHandDrag);

在这个示例中,我们创建了一个 QGraphicsView 对象,并将其拖拽模式设置为 ScrollHandDrag,这意味着用户可以通过按下鼠标并拖动来平移视图。

根据您的应用程序需求和用户交互设计,您可以选择合适的拖拽模式。这些模式可以帮助用户更轻松地与视图中的对象进行交互操作。

请注意,拖拽模式的选择应该符合用户体验原则,并根据应用程序的需求进行调整。

4.5. setForegroundBrush 设置前景画刷

void setForegroundBrush(const QBrush &brush)

4.2. setInteractive 设置互动

void setInteractive(bool allowed)

如果启用了此属性,视图将允许与场景进行交互。否则,视图将不允许交互,任何鼠标或键盘事件都将被忽略(即,它将作为只读视图)。

4.6. setMatrix 设置变换矩阵

在 Qt 中,QGraphicsView::setMatrix 函数用于设置 QGraphicsView 的变换矩阵。这个函数可以用来对视图进行平移、缩放、旋转等变换操作。

  • 原型:
void QGraphicsView::setMatrix(const QMatrix &matrix, bool combine = false);
  • 参数说明:

    • matrix: 要设置的变换矩阵。
    • combine: 一个布尔值,指示是否将新的变换矩阵与当前变换矩阵组合。如果为 true,则新的变换矩阵将与当前变换矩阵相乘;如果为 false,则新的变换矩阵将替换当前变换矩阵。
  • 返回值:

    • 无返回值。
  • 示例:

#include <QGraphicsView>
#include <QMatrix>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QGraphicsScene scene;
    QGraphicsView view(&scene);

    // 创建一个缩放因子为2的变换矩阵
    QMatrix matrix;
    matrix.scale(2, 2);

    // 将变换矩阵应用到视图中
    view.setMatrix(matrix);

    view.show();
    
    return app.exec();
}

在这个示例中,我们创建了一个 QGraphicsView 对象,并创建了一个缩放因子为2的变换矩阵。然后,我们通过调用 setMatrix 函数将这个变换矩阵应用到视图中,实现了对视图的缩放操作。

4.7. setOptimizationFlag 设置优化标志

void setOptimizationFlag(QGraphicsView::OptimizationFlag flag, bool enabled = true)
void setOptimizationFlags(QGraphicsView::OptimizationFlags flags)

QGraphicsView::OptimizationFlag 是一个枚举类型,用于指定 QGraphicsView 类中的优化标志。这些标志可以帮助控制视图的性能和渲染行为。

以下是 QGraphicsView::OptimizationFlag 的枚举值:

  • DontClipPainter: 不要裁剪绘图器。这个标志可以提高性能,但可能导致绘图器绘制超出视图矩形的内容。
  • DontSavePainterState: 不要保存绘图器的状态。这个标志可以提高性能,但可能导致绘图器状态在绘制期间被修改。
  • DontAdjustForAntialiasing: 不要调整图元的位置以适应抗锯齿。这个标志可以提高性能,但可能导致图元在绘制时出现锯齿现象。

您可以使用这些优化标志来调整 QGraphicsView 的性能和渲染行为,根据应用程序的需求进行优化。

4.8. setRenderHint 设置渲染提示

void setRenderHint(QPainter::RenderHint hint, bool enabled = true)

QPainter::RenderHint 是一个枚举类型,用于设置绘图器 QPainter 的渲染提示。这些提示可以影响绘图的质量和性能。

以下是 QPainter::RenderHint 的一些常见枚举值:

  • Antialiasing: 启用抗锯齿渲染,使绘制的边缘更加平滑。
  • TextAntialiasing: 启用文本抗锯齿渲染,使文本显示更清晰。
  • SmoothPixmapTransform: 启用平滑的像素变换,用于绘制图像时的平滑缩放。
  • HighQualityAntialiasing: 启用高质量抗锯齿渲染,提供更高质量的抗锯齿效果。

您可以使用这些渲染提示来控制 QPainter 的绘图质量和性能。根据需要,您可以根据应用程序的需求设置适当的渲染提示。

4.9. setResizeAnchor 设置锚点位置

void setResizeAnchor(QGraphicsView::ViewportAnchor anchor)

QGraphicsView::ViewportAnchor 是一个枚举类型,用于指定视图中场景项的锚点位置。这个枚举类型定义了视图中场景项相对于视图视口的位置,以便在视图变换时保持场景项的位置。

以下是 QGraphicsView::ViewportAnchor 的一些枚举值:

  • NoAnchor: 没有锚点,场景项不会相对于视口进行定位。
  • AnchorViewCenter: 锚点在视图中心,场景项将相对于视图中心进行定位。
  • AnchorUnderMouse: 锚点在鼠标位置下,场景项将相对于鼠标位置下的点进行定位。
  • AnchorOnItem: 锚点在场景项上,场景项将相对于自身的位置进行定位。

通过设置适当的视口锚点,您可以控制场景项在视图中的定位方式,从而在视图变换时实现不同的效果。

4.10. setRubberBandSelectionMode 设置选择模式

void setRubberBandSelectionMode(Qt::ItemSelectionMode mode)

在 Qt 中,Qt::ItemSelectionMode 是一个枚举类型,用于指定视图中项目的选择模式。这个枚举类型定义了视图中项目的选择行为。

以下是 Qt::ItemSelectionMode 的一些常见枚举值:

  • Qt::NoSelection: 禁止选择任何项目。
  • Qt::SingleSelection: 只允许选择一个项目。
  • Qt::MultiSelection: 允许选择多个项目。
  • Qt::ExtendedSelection: 允许使用 Shift 和 Ctrl 键扩展选择多个项目。

通过设置适当的项目选择模式,您可以控制用户在视图中选择项目的方式。这对于各种应用程序中的数据展示和交互非常重要。

4.11. setScene 设置场景

void setScene(QGraphicsScene *scene)

4.12. setSceneRect 设置场景区域

void setSceneRect(const QRectF &rect)
void setSceneRect(qreal x, qreal y, qreal w, qreal h)

4.3. setTransform 设置视图的变换矩阵

void setTransform(const QTransform &matrix, bool combine = false)

QGraphicsView::setTransform 是 Qt 中 QGraphicsView 类的成员函数之一,用于设置视图的变换矩阵。这个函数允许您手动设置视图的变换,例如平移、缩放和旋转,以改变视图中场景项的显示方式。

参数说明:

  • matrix:要应用于视图的变换矩阵。
  • combine:一个布尔值,指示是否将新变换与现有变换组合。如果为 false,则新变换会替代现有变换;如果为 true,则新变换会与现有变换组合。

通过调用 setTransform 函数,您可以实现对视图进行自定义变换,从而实现缩放、平移、旋转等操作。这对于实现复杂的用户交互和定制视图显示效果非常有用。

4.13. setTransformationAnchor

void setTransformationAnchor(QGraphicsView::ViewportAnchor anchor)

4.14. setViewportUpdateMode 设置更新模式

void  setViewportUpdateMode(QGraphicsView::ViewportUpdateMode mode)

在 Qt 中,QGraphicsView::ViewportUpdateMode 是一个枚举类型,用于指定视图中视口更新的模式。这个枚举类型定义了视图中视口更新的行为。

以下是 QGraphicsView::ViewportUpdateMode 的一些常见枚举值:

  • QGraphicsView::FullViewportUpdate: 在每次绘制时,整个视口都会被更新。
  • QGraphicsView::MinimalViewportUpdate: 只有发生变化的区域会被更新,这可以提高性能。
  • QGraphicsView::SmartViewportUpdate: 智能更新模式,视图会尝试优化更新以提高性能。

通过设置适当的视口更新模式,您可以控制视图中视口的更新方式,从而在绘制时获得更好的性能和用户体验。

5. 槽函数

5.1. invalidateScene 更新场景特定区域

介绍:
QGraphicsView::invalidateScene 槽函数用于标记场景中的特定区域需要更新。当调用此槽函数时,视图将使指定的矩形区域无效,并在下一次绘制时更新这部分内容。

槽函数:

void QGraphicsView::invalidateScene(const QRectF &rect)

参数:

  • rect:表示需要更新的场景中的矩形区域。

示例:

// 在需要更新的地方调用 invalidateScene 槽函数
view->invalidateScene(QRectF(100, 100, 200, 200));

在这个示例中,我们展示了如何在需要更新的地方调用 QGraphicsView::invalidateScene 槽函数,以标记场景中的一个矩形区域需要更新。在下一次绘制时,视图将更新这部分内容。

5.2. invalidateScene 更新场景

5.2. updateSceneRect 更新场景

通知QGraphicsView场景的场景矩形已经改变。rect是新的场景rect,如果视图已经有一个显式设置的场景rect,这个函数不做任何事情。

6. 信号

6.1. rubberBandChanged 橡皮筋选择框变化

介绍:
QGraphicsView::rubberBandChanged 信号在橡皮筋选择框的区域发生变化时发出。橡皮筋选择框通常用于实现在视图中选择多个项的操作,类似于桌面应用程序中的拖动选择功能。

当用户在视图中拖动以创建或调整橡皮筋选择框时,此信号将发出,提供了橡皮筋选择框的视口矩形、起点和终点在场景坐标中的位置信息。

信号:

void QGraphicsView::rubberBandChanged(const QRect &viewportRect, const QPointF &fromScenePoint, const QPointF &toScenePoint)

参数:

  • viewportRect:表示橡皮筋选框的视口矩形。
  • fromScenePoint:橡皮筋选框起点在场景坐标中的位置。
  • toScenePoint:橡皮筋选框终点在场景坐标中的位置。

示例:

// 连接 rubberBandChanged 信号到槽函数
connect(view, &QGraphicsView::rubberBandChanged, [=](const QRect &viewportRect, const QPointF &fromScenePoint, const QPointF &toScenePoint) {
    qDebug() << "Rubber Band Changed:";
    qDebug() << "Viewport Rect: " << viewportRect;
    qDebug() << "From Scene Point: " << fromScenePoint;
    qDebug() << "To Scene Point: " << toScenePoint;
});

在这个示例中,我们展示了如何连接 QGraphicsView::rubberBandChanged 信号到一个 lambda 表达式的槽函数。当橡皮筋选择框的区域发生变化时,槽函数会输出橡皮筋选择框的视口矩形、起点和终点在场景坐标中的位置信息。

7.事件

7.1. contextMenuEvent 处理上下文菜单事件的函数

contextMenuEvent 是用于处理上下文菜单事件的函数,通常在自定义的 QGraphicsScene 类中重写这个函数来处理场景中的上下文菜单事件。

函数原型:

virtual void QGraphicsView::contextMenuEvent(QContextMenuEvent *event)

参数说明:

  • event:表示上下文菜单事件的对象,包含了与事件相关的信息,如鼠标点击位置等。

示例说明:
以下是一个简单的示例,演示了如何在自定义的 QGraphicsView 类中重写 contextMenuEvent 函数,以便处理场景中的上下文菜单事件:

#include <QGraphicsView>
#include <QMenu>
#include <QContextMenuEvent>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent) {}

protected:
    void contextMenuEvent(QContextMenuEvent *event) override
    {
        QMenu menu(this);
        menu.addAction("Action 1");
        menu.addAction("Action 2");
        menu.addAction("Action 3");

        menu.exec(event->globalPos());
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了contextMenuEvent函数,在右键单击时创建一个简单的上下文菜单,并在事件发生的全局位置显示它。

7.2.dragEnterEvent 拖放 拖入事件

用于处理拖放操作中的“进入”事件。在Qt中,当拖动物体进入场景时,会触发这个事件。你可以在自定义的 QGraphicsView 类中重写这个函数,以处理拖放操作的进入事件。

函数原型:

void QGraphicsView::dragEnterEvent(QDragEnterEvent *event)

参数说明:

  • event:指向拖拽进入事件对象的指针,包含有关事件的信息,如拖拽的数据、拖拽的源头等。

返回值:

  • void:没有返回值。

完整示例:

下面是一个完整示例,演示如何重写QGraphicsViewdragEnterEvent函数以捕获拖拽进入事件并根据拖拽的数据类型执行相应操作:

#include <QGraphicsView>
#include <QDragEnterEvent>
#include <QMimeData>
#include <QDebug>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent)
    {
        setAcceptDrops(true); // 允许接受拖拽事件
    }

protected:
    void dragEnterEvent(QDragEnterEvent *event) override
    {
        if (event->mimeData()->hasFormat("text/plain"))
        {
            qDebug() << "Dragged in with text data.";
        }
        else if (event->mimeData()->hasFormat("image/png"))
        {
            qDebug() << "Dragged in with PNG image data.";
        }
        else
        {
            qDebug() << "Unsupported data format.";
            event->ignore(); // 忽略拖拽操作
        }
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了dragEnterEvent函数,在拖拽进入时检查拖拽的数据格式,如果是纯文本格式或PNG图像格式,则输出相应的消息;否则,忽略该拖拽操作。

dragLeaveEvent 拖放 拖离事件

QGraphicsView::dragLeaveEvent 是一个事件处理函数,用于处理拖放操作中的“离开”事件。在Qt中,当拖动物体离开场景时,会触发这个事件。你可以在自定义的 QGraphicsView 类中重写这个函数,以处理拖放操作的离开事件。

函数原型:

void QGraphicsView::dragLeaveEvent(QDragLeaveEvent *event)

参数说明:

  • event:指向拖拽离开事件对象的指针,包含有关事件的信息,如拖拽的数据、拖拽的源头等。

返回值:

  • void:没有返回值。

完整示例:

下面是一个完整示例,演示如何重写QGraphicsViewdragLeaveEvent函数以捕获拖拽离开事件并执行相应操作:

#include <QGraphicsView>
#include <QDragLeaveEvent>
#include <QDebug>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent)
    {
        setAcceptDrops(true); // 允许接受拖拽事件
    }

protected:
    void dragLeaveEvent(QDragLeaveEvent *event) override
    {
        qDebug() << "Drag left the graphics view.";
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了dragLeaveEvent函数,在拖拽离开时输出相应的消息。

7.3.dragMoveEvent 拖放 移动事件

QGraphicsView::dragMoveEvent 是一个事件处理函数,用于处理拖放操作中的“移动”事件。在Qt中,当拖动物体在场景中移动时,会触发这个事件。你可以在自定义的 QGraphicsView 类中重写这个函数,以处理拖放操作的移动事件。

函数原型:

void QGraphicsView::dragMoveEvent(QDragMoveEvent *event)

参数说明:

  • event:指向拖拽移动事件对象的指针,包含有关事件的信息,如拖拽的数据、拖拽的源头等。

返回值:

  • void:没有返回值。

完整示例:

下面是一个完整示例,演示如何重写QGraphicsViewdragMoveEvent函数以捕获拖拽移动事件并执行相应操作:

#include <QGraphicsView>
#include <QDragMoveEvent>
#include <QDebug>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent)
    {
        setAcceptDrops(true); // 允许接受拖拽事件
    }

protected:
    void dragMoveEvent(QDragMoveEvent *event) override
    {
        qDebug() << "Drag moving over the graphics view.";
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了dragMoveEvent函数,在拖拽移动时输出相应的消息。

7.4.dropEvent 拖动 放下事件

dropEvent 是一个事件处理函数,用于处理拖放操作中的“放下”事件。在 Qt 中,当用户拖动一个控件或数据并释放鼠标时,会触发 dropEvent 事件,你可以在这个事件处理函数中实现相应的逻辑来处理放下操作。

函数原型:

void QGraphicsView::dropEvent(QDropEvent *event)

参数说明:

  • event:指向放置事件对象的指针,包含有关事件的信息,如放置的数据、放置的位置等。

完整示例:

下面是一个完整示例,演示如何重写QGraphicsViewdropEvent函数以捕获放置事件并执行相应操作:

#include <QGraphicsView>
#include <QDropEvent>
#include <QMimeData>
#include <QDebug>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent)
    {
        setAcceptDrops(true); // 允许接受拖拽事件
    }

protected:
    void dropEvent(QDropEvent *event) override
    {
        const QMimeData *mimeData = event->mimeData();
        if (mimeData->hasUrls())
        {
            QList<QUrl> urlList = mimeData->urls();
            for (const QUrl &url : urlList)
            {
                qDebug() << "Dropped file URL:" << url.toString();
            }
        }
        else
        {
            qDebug() << "Unsupported drop data.";
            event->ignore(); // 忽略放置操作
        }
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了dropEvent函数,在放置事件发生时检查数据类型,如果是URL数据,则输出URL;否则,忽略该放置操作。

7.5.focusNextPrevChild 上下级部件焦点切换

函数原型:

bool QGraphicsView::focusNextPrevChild(bool next)

参数说明:

  • next:一个布尔值,指示是寻找下一个子部件(true)还是上一个子部件(false)。

返回值:

  • bool:如果成功找到并设置了新的焦点子部件,则返回true;否则返回false

函数功能:

  • focusNextPrevChild函数用于在父部件中切换焦点子部件。当焦点部件在父部件中时,该函数会尝试将焦点切换到下一个或上一个子部件。重写这个函数可以自定义焦点切换的行为。

完整示例:

下面是一个完整示例,演示如何重写QGraphicsViewfocusNextPrevChild函数以自定义焦点切换行为:

#include <QGraphicsView>
#include <QDebug>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent) {}

protected:
    bool focusNextPrevChild(bool next) override
    {
        if (next)
        {
            qDebug() << "Moving focus to the next child.";
        }
        else
        {
            qDebug() << "Moving focus to the previous child.";
        }

        // 执行默认的焦点切换行为
        return QGraphicsView::focusNextPrevChild(next);
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了focusNextPrevChild函数,在焦点切换时输出相应的消息,并调用基类的实现来执行默认的焦点切换行为。

7.6.focusInEvent 场景获得焦点

focusInEvent 是一个事件处理函数,用于处理控件获得焦点时触发的事件。在 Qt 中,当一个控件获得焦点时(例如用户点击了该控件),会触发 focusInEvent 事件,你可以在这个事件处理函数中编写相应的逻辑来处理控件获得焦点的情况。

函数原型:

void QGraphicsView::focusInEvent(QFocusEvent *event)

参数说明:

  • event:指向焦点进入事件对象的指针,包含有关事件的信息,如焦点的原因、焦点的类型等。

完整示例:

下面是一个完整示例,演示如何重写QGraphicsViewfocusInEvent函数以捕获焦点进入事件并执行相应操作:

#include <QGraphicsView>
#include <QFocusEvent>
#include <QDebug>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent)
    {
        setFocusPolicy(Qt::StrongFocus); // 设置焦点策略为StrongFocus,以便接收焦点事件
    }

protected:
    void focusInEvent(QFocusEvent *event) override
    {
        if (event->reason() == Qt::MouseFocusReason)
        {
            qDebug() << "Focus entered due to mouse interaction.";
        }
        else if (event->reason() == Qt::TabFocusReason)
        {
            qDebug() << "Focus entered due to tab key.";
        }
        else
        {
            qDebug() << "Focus entered for another reason.";
        }
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了focusInEvent函数,在焦点进入时检查焦点的原因,并输出相应的消息。

7.7.focusOutEvent 焦点离开事件

在 Qt 中,focusOutEvent 是一个用于处理焦点离开事件的函数,通常在继承自 QWidget 或其子类的自定义部件中使用

函数原型:

void QGraphicsView::focusOutEvent(QFocusEvent *event)

参数说明:

  • event:一个QFocusEvent类型的指针,包含有关焦点事件的信息。

函数功能:

  • focusOutEvent函数在QGraphicsView失去焦点时被调用。您可以重写这个函数以处理失去焦点时的特定行为。

完整示例:

下面是一个示例,演示如何重写QGraphicsViewfocusOutEvent函数以自定义失去焦点时的行为:

#include <QGraphicsView>
#include <QFocusEvent>
#include <QDebug>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent) {}

protected:
    void focusOutEvent(QFocusEvent *event) override
    {
        // 调用基类实现以确保正确处理焦点事件
        QGraphicsView::focusOutEvent(event);

        // 自定义失去焦点时的行为
        qDebug() << "Custom focus out event triggered.";
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了focusOutEvent函数,在失去焦点时输出相应的消息,并调用基类的实现以确保正确处理焦点事件。

7.8.inputMethodEvent 输入法事件

此事件处理程序(用于事件事件)可以在子类中重新实现,以接收场景的输入法事件。
默认实现将事件转发给focusItem()。如果当前没有焦点项或当前焦点项不接受输入法,则此函数不执行任何操作。

函数原型:

void QGraphicsView::inputMethodEvent(QInputMethodEvent *event)

参数说明:

  • event:一个QInputMethodEvent类型的指针,包含有关输入法事件的信息。

函数功能:

  • inputMethodEvent函数在QGraphicsView接收到输入法事件时被调用。您可以重写这个函数以处理输入法事件,例如处理输入法文本。

完整示例:

下面是一个示例,演示如何重写QGraphicsViewinputMethodEvent函数以自定义处理输入法事件:

#include <QGraphicsView>
#include <QInputMethodEvent>
#include <QDebug>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent) {}

protected:
    void inputMethodEvent(QInputMethodEvent *event) override
    {
        // 调用基类实现以确保正确处理输入法事件
        QGraphicsView::inputMethodEvent(event);

        // 自定义处理输入法事件的行为
        qDebug() << "Input method event received.";
        qDebug() << "Input method preedit text: " << event->preeditString();
        qDebug() << "Input method commit text: " << event->commitString();
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了inputMethodEvent函数,在接收到输入法事件时输出相关信息,并调用基类的实现以确保正确处理输入法事件。

7.9.keyPressEvent 键盘按下事件

函数原型:

QGraphicsView::keyPressEvent(QKeyEvent *keyEvent)

事件keyEvent的事件处理程序可以在子类中重新实现,以接收按键事件。默认实现将事件转发到当前焦点项。

函数原型:

void QGraphicsView::keyPressEvent(QKeyEvent *event)

参数说明:

  • event:一个QKeyEvent类型的指针,包含有关按键事件的信息。

函数功能:

  • keyPressEvent函数在QGraphicsView接收到键盘按键按下事件时被调用。您可以重写这个函数以处理特定的键盘按键事件。

完整示例:

下面是一个示例,演示如何重写QGraphicsViewkeyPressEvent函数以自定义处理键盘按键事件:

#include <QGraphicsView>
#include <QKeyEvent>
#include <QDebug>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent) {}

protected:
    void keyPressEvent(QKeyEvent *event) override
    {
        // 调用基类实现以确保正确处理键盘按键事件
        QGraphicsView::keyPressEvent(event);

        // 自定义处理键盘按键事件的行为
        qDebug() << "Key pressed: " << event->key();
        qDebug() << "Modifiers: " << event->modifiers();
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了keyPressEvent函数,在接收到键盘按键按下事件时输出相关信息,并调用基类的实现以确保正确处理键盘按键事件。

7.10.keyReleaseEvent 键盘释放事件

函数原型:

void QGraphicsView::keyReleaseEvent(QKeyEvent *event)

事件keyEvent的事件处理程序可以在子类中重新实现,以接收键释放事件。默认实现将事件转发到当前焦点项。

7.11.mouseDoubleClickEvent 鼠标双击事件

函数原型:

void QGraphicsView::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *mouseEvent)

mouseEvent的事件处理程序可以在子类中重新实现,以接收场景的鼠标双击事件。
如果有人在场景上双击,场景将首先接收鼠标按下事件,然后是释放事件(即单击),然后是双击事件,最后是释放事件。如果双击事件传递给的项目与接收第一次新闻和发布的项目不同,则它将作为新闻事件传递。然而,在这种情况下,tripleclick事件不会作为双击事件传递。
默认实现类似于mousePressEvent()。
注意:请参阅items()获取哪些项被此函数视为可见的定义。

7.12.mouseMoveEvent 鼠标移动事件

函数原型:

void QGraphicsView::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)

事件mouseEvent的事件处理程序可以在子类中重新实现,以接收场景的鼠标移动事件。
默认实现取决于鼠标抓取器状态。如果存在鼠标抓取项,则将事件发送给鼠标抓取项。如果在当前位置有任何接受悬停事件的项目,则该事件被转换为悬停事件并接受;否则它将被忽略。

7.13.mousePressEvent 鼠标按下事件

函数原型:

void QGraphicsView::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)

事件mouseEvent的事件处理程序可以在子类中重新实现,以接收场景的鼠标按下事件。
默认实现取决于场景的状态。如果有鼠标抓取器项,则将事件发送给鼠标抓取器。否则,它将被转发到最上面的可见项,该项接受来自事件的场景位置的鼠标事件,并且该项立即成为鼠标抓取项。
如果在场景的给定位置上没有项目,则重置选择区域,任何焦点项目将失去其输入焦点,然后忽略事件。
注意:请参阅items()获取哪些项被此函数视为可见的定义。

7.14.mouseReleaseEvent 鼠标释放事件

函数原型:

void QGraphicsView::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)

事件mouseEvent的事件处理程序可以在子类中重新实现,以接收场景的鼠标释放事件。
默认实现取决于鼠标抓取器状态。如果没有鼠标抓取器,则忽略该事件。否则,如果存在鼠标抓取项,则将事件发送给鼠标抓取项。如果此鼠标释放表示鼠标上最后按下的按钮,则鼠标抓取项将失去鼠标抓取。

7.15.mouseReleaseEvent 鼠标滚轮事件

函数原型:

void QGraphicsView::wheelEvent(QGraphicsSceneWheelEvent *wheelEvent)

事件wheelEvent的事件处理程序可以在子类中重新实现,以接收场景的鼠标滚轮事件。
默认情况下,将事件传递给光标下最上面的可见项。如果被忽略,事件将传播到下面的项目,直到事件被接受或到达场景为止。如果没有项接受该事件,则忽略该事件。
注意:请参阅items()获取哪些项被此函数视为可见的定义。

7.16.paintEvent 处理重绘事件

函数原型:

void QGraphicsView::paintEvent(QPaintEvent *event)

参数说明:

  • event:一个QPaintEvent类型的指针,包含有关绘图事件的信息。

函数功能:

  • paintEvent函数在QGraphicsView需要重绘时被调用。您可以重写这个函数以自定义绘图行为,例如绘制额外的内容或修改绘图的方式。

完整示例:

以下是一个示例,演示如何重写QGraphicsViewpaintEvent函数以自定义绘图行为:

#include <QGraphicsView>
#include <QPaintEvent>
#include <QPainter>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent) {}

protected:
    void paintEvent(QPaintEvent *event) override
    {
        // 调用基类实现以确保正确处理绘图事件
        QGraphicsView::paintEvent(event);

        // 自定义绘图行为
        QPainter painter(viewport());
        painter.setPen(Qt::red);
        painter.setFont(QFont("Arial", 12));
        painter.drawText(10, 10, "Custom Text");
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了paintEvent函数,在需要重绘时使用QPainter绘制自定义文本。在这个示例中,我们将文本绘制为红色并使用Arial字体。

7.17.resizeEvent 处理视图大小变化事件

函数原型:

void QGraphicsView::resizeEvent(QResizeEvent *event)

参数说明:

  • event:一个QResizeEvent类型的指针,包含有关大小调整事件的信息。

函数功能:

  • resizeEvent函数在QGraphicsView的大小调整时被调用。您可以重写这个函数以响应视图大小的变化,并根据需要更新视图的内容或布局。

完整示例:

以下是一个示例,演示如何重写QGraphicsViewresizeEvent函数以自定义处理视图大小调整事件:

#include <QGraphicsView>
#include <QResizeEvent>
#include <QDebug>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent) {}

protected:
    void resizeEvent(QResizeEvent *event) override
    {
        // 调用基类实现以确保正确处理大小调整事件
        QGraphicsView::resizeEvent(event);

        // 自定义处理大小调整事件的行为
        qDebug() << "View resized to: " << event->size();
        // 在这里可以添加代码来更新视图内容或布局
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了resizeEvent函数,在视图大小调整时输出调整后的大小,并可以在需要时添加代码来更新视图内容或布局。

7.18.scrollContentsBy 内容滚动事件

函数原型:

void QGraphicsView::scrollContentsBy(int dx, int dy)

参数说明:

  • dx:水平滚动的像素数。
  • dy:垂直滚动的像素数。

函数功能:

  • scrollContentsBy函数在QGraphicsView的内容滚动时被调用。您可以重写这个函数以自定义处理内容的滚动行为。

完整示例:

以下是一个示例,演示如何重写QGraphicsViewscrollContentsBy函数以自定义处理内容滚动事件:

#include <QGraphicsView>
#include <QDebug>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent) {}

protected:
    void scrollContentsBy(int dx, int dy) override
    {
        // 调用基类实现以确保正确处理内容滚动事件
        QGraphicsView::scrollContentsBy(dx, dy);

        // 自定义处理内容滚动事件的行为
        qDebug() << "Contents scrolled by: " << dx << ", " << dy;
        // 在这里可以添加代码来处理内容的滚动
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了scrollContentsBy函数,在内容滚动时输出滚动的像素数,并可以在需要时添加代码来处理内容的滚动。

7.19.showEvent 视图显示事件

函数原型:

void QGraphicsView::showEvent(QShowEvent *event)

参数说明:

  • event:一个QShowEvent类型的指针,包含有关显示事件的信息。

函数功能:

  • showEvent函数在QGraphicsView被显示时调用。您可以重写这个函数以在视图显示时执行特定的操作。

完整示例:

以下是一个示例,演示如何重写QGraphicsViewshowEvent函数以自定义处理视图显示事件:

#include <QGraphicsView>
#include <QShowEvent>
#include <QDebug>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent) {}

protected:
    void showEvent(QShowEvent *event) override
    {
        // 调用基类实现以确保正确处理显示事件
        QGraphicsView::showEvent(event);

        // 自定义处理显示事件的行为
        qDebug() << "View is now shown";
        // 在这里可以添加代码来执行视图显示时的操作
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了showEvent函数,在视图显示时输出一条消息,并可以在需要时添加代码来执行视图显示时的操作。

7.20. viewportEvent 视口接收事件

函数原型:

bool QGraphicsView::viewportEvent(QEvent *event)

参数说明:

  • event:一个QEvent类型的指针,表示发生的事件。

函数功能:

  • viewportEvent函数在QGraphicsView的视口(viewport)接收到事件时被调用。您可以重写这个函数以自定义处理视图接收到的事件。

完整示例:

以下是一个示例,演示如何重写QGraphicsViewviewportEvent函数以自定义处理视图视口事件:

#include <QGraphicsView>
#include <QEvent>
#include <QDebug>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent) {}

protected:
    bool viewportEvent(QEvent *event) override
    {
        // 自定义处理视口事件的行为
        if (event->type() == QEvent::MouseButtonPress)
        {
            qDebug() << "Mouse button pressed in viewport";
            // 在这里可以添加处理鼠标按下事件的代码
        }

        // 调用基类实现以确保正确处理视口事件
        return QGraphicsView::viewportEvent(event);
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了viewportEvent函数,在视图视口接收到鼠标按下事件时输出一条消息,并可以在需要时添加处理鼠标按下事件的代码。

7.21.wheelEvent 滚动事件

函数原型:

void QGraphicsView::wheelEvent(QWheelEvent *event)

参数说明:

  • event:一个QWheelEvent类型的指针,包含有关鼠标滚轮事件的信息。

函数功能:

  • wheelEvent函数在QGraphicsView接收到鼠标滚轮事件时被调用。您可以重写这个函数以自定义处理鼠标滚轮事件。

完整示例:

以下是一个示例,演示如何重写QGraphicsViewwheelEvent函数以自定义处理鼠标滚轮事件:

#include <QGraphicsView>
#include <QWheelEvent>
#include <QDebug>

class CustomGraphicsView : public QGraphicsView
{
public:
    CustomGraphicsView(QWidget *parent = nullptr) : QGraphicsView(parent) {}

protected:
    void wheelEvent(QWheelEvent *event) override
    {
        // 自定义处理鼠标滚轮事件的行为
        qDebug() << "Mouse wheel scrolled";

        // 获取滚轮滚动的角度值
        int delta = event->angleDelta().y();

        // 根据滚动方向处理视图缩放
        if (delta > 0)
        {
            // 向上滚动,放大视图
            scale(1.1, 1.1);
        }
        else if (delta < 0)
        {
            // 向下滚动,缩小视图
            scale(0.9, 0.9);
        }

        // 调用基类实现以确保正确处理鼠标滚轮事件
        QGraphicsView::wheelEvent(event);
    }
};

在这个示例中,我们创建了一个名为CustomGraphicsView的自定义QGraphicsView子类。我们重写了wheelEvent函数,在接收到鼠标滚轮事件时输出一条消息,并根据滚动方向放大或缩小视图。

  • 30
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 关于Qt QGraphicsView绘制折线的问题,以下是解答: Qt QGraphicsView是一个高级的2D图形控件,是基于MVC架构设计的。QGraphicsView可以用来展示绘制出来的图形,包括图像、文本、图表等等。 要在Qt QGraphicsView中绘制折线,可以使用QGraphicsScene和QGraphicsLineItem等相关类。具体操作可以分为几个步骤: 1.创建QGraphicsScene对象,用来存放绘制的图元。 2.根据需要创建QGraphicsLineItem对象,用来绘制折线。 3.将QGraphicsLineItem对象添加到QGraphicsScene中。 4.创建QGraphicsView对象,将QGraphicsScene设置为其场景。 5.将QGraphicsView对象添加到需要展示的窗口中。 以上就是在Qt QGraphicsView中绘制折线的基本步骤,具体实现可以参考Qt官方文档和示例代码。 ### 回答2: Qt是一个高效、跨平台的C++图形界面开发框架,支持多种绘图和绘制工具,其中包括了QT QGraphicsView。在QT QGraphicsView中,绘制折线可以通过以下步骤实现: 1.创建一个QGraphicsScene对象,该对象将显示在QGraphicsView中 2.在QGraphicsScene中添加一个折线 3.使用QGraphicsView来显示QGraphicsScene中的折线 下面我们将详细说明如何通过步骤来实现。 1.创建QGraphicsScene 在Qt中创建QGraphicsScene对象可使用以下代码: ``` QGraphicsScene *scene = new QGraphicsScene(this); ``` 这个代码创建了一个新的QGraphicsScene对象,应用程序中视图的大小将用于Scene的大小,this指针表示这个画布和QTUI相关。 2.添加折线 接下来,我们将在上一步中创建的画布中添加一条折线。 创建一个QGraphicsLineItem对象 ``` QGraphicsLineItem *line = new QGraphicsLineItem(x1, y1, x2, y2); ``` x1和y1是折线的起点,x2和y2是折线的终点。 将创建的QGraphicsLineItem对象添加到QGraphicsScene中 ``` scene->addItem(line); ``` 3.创建QGraphicsView 创建QGraphicsView对象是将折线显示在屏幕上。以下代码创建了QGraphicsView对象: ``` QGraphicsView *view = new QGraphicsView(scene); ``` scene是指先前创建的QGraphicsScene对象。 完整示例代码: ``` //创建QGraphicsScene对象 QGraphicsScene *scene = new QGraphicsScene(this); //创建折线 QGraphicsLineItem *line = new QGraphicsLineItem(x1, y1, x2, y2); //将折线添加到QGraphicsScene scene->addItem(line); //创建QGraphicsView QGraphicsView *view = new QGraphicsView(scene); //将QGraphicsView视图添加到QtUI界面中 ui->widget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); ui->widget->setScene(scene); ``` 通过上面的步骤,可以轻松在Qt中绘制折线,为了更好的用户交互体验,可以增加一些代码来设置折线颜色、线宽度等等。到这里绘制折线已经完成了,现在用户可以在QGraphicsView中与折线进行交互,并进行一些操作,例如缩放、拖拽等等。 ### 回答3: Qt QGraphicsView 是一个强大的图形视图框架,提供了绘制各种图形的方法,包括绘制折线。下面我将介绍如何使用 QGraphicsView 进行折线绘制。 首先,我们需要创建一个 QGraphicsView 对象和一个 QGraphicsScene 对象,并将 QGraphicsScene 对象设置为 QGraphicsView 的场景。接下来,我们需要创建一个 QGraphicsLineItem 对象来表示折线。代码如下: ```cpp QGraphicsView *view = new QGraphicsView(this); QGraphicsScene *scene = new QGraphicsScene(this); view->setScene(scene); QGraphicsLineItem *lineItem = new QGraphicsLineItem(); ``` 然后,我们需要设置线条的起始点和结束点,以及线条的样式。这可以通过 QGraphicsLineItem 的 setLine() 方法来实现。我们还可以通过 QGraphicsLineItem 的 setPen() 方法设置线条的颜色和宽度。示例代码如下: ```cpp lineItem->setLine(0, 0, 100, 100); // 设置起始点和结束点 QPen pen(Qt::red); // 创建颜色为红色的笔 pen.setWidth(2); // 设置线条宽度为 2 lineItem->setPen(pen); // 设置线条样式 ``` 最后,我们需要将 QGraphicsLineItem 对象添加到 QGraphicsScene 中,以便它能够在 QGraphicsView 中进行显示。示例代码如下: ```cpp scene->addItem(lineItem); ``` 综上所述,以上代码展示了如何使用 QGraphicsView 绘制折线。当然,还有很多其他的绘制方法和属性可以应用于 QGraphicsView 和 QGraphicsLineItem 对象,根据实际需求进行选择和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Hwang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值