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