QT QGraphicsView介绍
版本:Qt 5.14
目录
- 介绍
- 属性
- 公共函数
- 设置相关函数
- 槽函数
- 信号
- 事件
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性能的标志:
- QGraphicsView::DontClipPainter:禁用绘图器的裁剪。
- QGraphicsView::DontSavePainterState:禁用绘图器状态的保存和恢复。
- QGraphicsView::DontAdjustForAntialiasing:禁用抗锯齿的调整。
- QGraphicsView::IndirectPainting:允许间接绘制,适用于OpenGL渲染。
- 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
transformationAnchor
是 QGraphicsView
类中的一个属性,用于设置或获取视图的变换锚点。这个变换锚点定义了视图中的位置,围绕这个点进行缩放和旋转操作。
在 QGraphicsView
中,transformationAnchor
属性通常用于以下目的:
-
定义变换中心:
transformationAnchor
确定了视图中的位置,围绕这个点进行缩放和旋转操作。当对视图进行缩放或旋转时,视图会围绕这个锚点进行变换。 -
控制变换效果:通过设置不同的变换锚点,可以实现不同的视图变换效果。例如,将变换锚点设置为视图中心可以使缩放和旋转围绕视图中心进行。
-
自定义视图行为:根据需要,您可以根据应用程序的要求设置不同的变换锚点,以实现特定的视图行为和用户体验。
通过设置 transformationAnchor
属性,您可以控制视图变换的中心点,从而影响视图的缩放和旋转行为。这可以帮助您实现定制的视图效果和交互体验。
2.13. viewportUpdateMode
视口更新模式
viewportUpdateMode
是 QGraphicsView
类中的一个属性,用于设置视图的视口更新模式。视口是指用于显示场景内容的窗口部分,而视口更新模式则控制在何种情况下视口会被更新。
在 QGraphicsView
中,viewportUpdateMode
属性通常用于以下目的:
-
控制视口更新:
viewportUpdateMode
属性允许您指定何时以及如何更新视图的视口。不同的模式可以影响视图的性能和显示效果。 -
优化视图更新:通过选择合适的更新模式,可以优化视图的更新过程,减少不必要的重绘操作,提高性能。
-
定制视图行为:根据应用程序的需求,您可以根据具体情况选择合适的更新模式,以实现特定的视图行为和用户体验。
一些常见的 viewportUpdateMode
模式包括:
MinimalViewportUpdate
:在最小范围内更新视口,以减少重绘操作。BoundingRectViewportUpdate
:基于场景中物体的边界矩形更新视口。SmartViewportUpdate
:智能更新模式,根据需要更新视口,以平衡性能和显示效果。
通过设置 viewportUpdateMode
属性,您可以控制视图的更新方式,以实现更高效的视图更新和更好的用户体验。根据应用程序的需求和性能要求,选择合适的更新模式非常重要。
3. 公共函数
3.1. QGraphicsView
构造函数
原型
QGraphicsView::QGraphicsView(QGraphicsScene *scene, QWidget *parent = nullptr)
QGraphicsView::QGraphicsView(QWidget *parent = nullptr)
介绍
QGraphicsView::QGraphicsView
是 QGraphicsView
类的构造函数,用于创建一个 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::~QGraphicsView
是 QGraphicsView
类的析构函数。析构函数在对象被销毁时调用,用于执行对象的清理工作,释放资源,以及执行其他必要的操作。
对于 QGraphicsView
类,析构函数通常用于清理与视图对象相关的资源,例如清理视图的状态、删除相关的对象等。在大多数情况下,您不需要显式调用析构函数,因为它会在对象超出范围时自动调用。
在 QGraphicsView
类中,析构函数的实现通常由 Qt 框架提供,您无需自己编写析构函数来清理视图对象。
如果您有特定的清理需求或者需要在视图对象被销毁时执行特定的操作,您可以通过继承 QGraphicsView
类并重写析构函数来实现这些行为。
3.3. centerOn
中心对齐
QGraphicsView::centerOn
是 QGraphicsView
类的一个成员函数,用于将视图中心对齐到给定的场景坐标点。这可以用于在视图中居中显示特定的场景项或位置。
原型
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::ensureVisible
是 QGraphicsView
类的一个成员函数,用于确保特定的区域在视图中可见,并根据需要调整视图的滚动条位置。
参数说明
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::fitInView
是 QGraphicsView
类的一个成员函数,用于将指定的矩形区域适应视图窗口的大小,并根据需要调整视图的缩放级别以确保整个区域可见。
原型
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::itemAt
是 QGraphicsView
类的一个成员函数,用于返回给定视图坐标下的图形项。如果在指定位置下没有图形项,则返回空指针。
原型
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
场景坐标映射到视图
mapFromScene
是 QGraphicsView
类的一个成员函数,用于将场景坐标映射到视图坐标。
原型
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
mapToScene
是 QGraphicsView
类的一个成员函数,用于将视图坐标映射到场景坐标。
原型
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
内容渲染
render
是 QGraphicsView
类的一个成员函数,用于在视图中渲染内容。这个函数可以用于将视图中的内容渲染到一个 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
:没有返回值。
完整示例:
下面是一个完整示例,演示如何重写QGraphicsView
的dragEnterEvent
函数以捕获拖拽进入事件并根据拖拽的数据类型执行相应操作:
#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
:没有返回值。
完整示例:
下面是一个完整示例,演示如何重写QGraphicsView
的dragLeaveEvent
函数以捕获拖拽离开事件并执行相应操作:
#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
:没有返回值。
完整示例:
下面是一个完整示例,演示如何重写QGraphicsView
的dragMoveEvent
函数以捕获拖拽移动事件并执行相应操作:
#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
:指向放置事件对象的指针,包含有关事件的信息,如放置的数据、放置的位置等。
完整示例:
下面是一个完整示例,演示如何重写QGraphicsView
的dropEvent
函数以捕获放置事件并执行相应操作:
#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
函数用于在父部件中切换焦点子部件。当焦点部件在父部件中时,该函数会尝试将焦点切换到下一个或上一个子部件。重写这个函数可以自定义焦点切换的行为。
完整示例:
下面是一个完整示例,演示如何重写QGraphicsView
的focusNextPrevChild
函数以自定义焦点切换行为:
#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
:指向焦点进入事件对象的指针,包含有关事件的信息,如焦点的原因、焦点的类型等。
完整示例:
下面是一个完整示例,演示如何重写QGraphicsView
的focusInEvent
函数以捕获焦点进入事件并执行相应操作:
#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
失去焦点时被调用。您可以重写这个函数以处理失去焦点时的特定行为。
完整示例:
下面是一个示例,演示如何重写QGraphicsView
的focusOutEvent
函数以自定义失去焦点时的行为:
#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
接收到输入法事件时被调用。您可以重写这个函数以处理输入法事件,例如处理输入法文本。
完整示例:
下面是一个示例,演示如何重写QGraphicsView
的inputMethodEvent
函数以自定义处理输入法事件:
#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
接收到键盘按键按下事件时被调用。您可以重写这个函数以处理特定的键盘按键事件。
完整示例:
下面是一个示例,演示如何重写QGraphicsView
的keyPressEvent
函数以自定义处理键盘按键事件:
#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
需要重绘时被调用。您可以重写这个函数以自定义绘图行为,例如绘制额外的内容或修改绘图的方式。
完整示例:
以下是一个示例,演示如何重写QGraphicsView
的paintEvent
函数以自定义绘图行为:
#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
的大小调整时被调用。您可以重写这个函数以响应视图大小的变化,并根据需要更新视图的内容或布局。
完整示例:
以下是一个示例,演示如何重写QGraphicsView
的resizeEvent
函数以自定义处理视图大小调整事件:
#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
的内容滚动时被调用。您可以重写这个函数以自定义处理内容的滚动行为。
完整示例:
以下是一个示例,演示如何重写QGraphicsView
的scrollContentsBy
函数以自定义处理内容滚动事件:
#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
被显示时调用。您可以重写这个函数以在视图显示时执行特定的操作。
完整示例:
以下是一个示例,演示如何重写QGraphicsView
的showEvent
函数以自定义处理视图显示事件:
#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)接收到事件时被调用。您可以重写这个函数以自定义处理视图接收到的事件。
完整示例:
以下是一个示例,演示如何重写QGraphicsView
的viewportEvent
函数以自定义处理视图视口事件:
#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
接收到鼠标滚轮事件时被调用。您可以重写这个函数以自定义处理鼠标滚轮事件。
完整示例:
以下是一个示例,演示如何重写QGraphicsView
的wheelEvent
函数以自定义处理鼠标滚轮事件:
#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
函数,在接收到鼠标滚轮事件时输出一条消息,并根据滚动方向放大或缩小视图。