【Qt图形视图框架】QGraphicsView分析
  yQAl4kecrO8W 2023年12月23日 55 0


简介

  1. QGraphicsView类提供了一个用于显示QGraphicsScene内容的部件。QGraphicsView以可滚动的视口可视化QGraphicsScene的内容。要创建包含几何项目的场景,可以查阅QGraphicsScene的文档。QGraphicsView是Graphics View框架的一部分。
  2. 要可视化一个场景,需要先创建一个QGraphicsView对象,将想要可视化的场景的地址传递给QGraphicsView的构造函数。或者,可以稍后调用setScene()来设置场景。调用show()之后,视图将默认滚动到场景的中心,并显示此时可见的任何项目。例如:
QGraphicsScene scene;
scene.addText("Hello, world!");

QGraphicsView view(&scene);
view.show();
  1. 通过使用滚动条或调用centerOn()显式滚动到场景上的任何位置。通过传递一个点到centerOn(),QGraphicsView将滚动其视口以确保该点位于视图中央。如果想要确保某个区域可见(但不一定居中),可以调用ensureVisible()代替。
  2. QGraphicsView可以用来可视化整个场景,也可以只可视化部分场景。可视化的区域在视图首次显示时默认通过调用QGraphicsScene::itemsBoundingRect()自动检测到。要手动设置可视化的区域矩形,可以调用setSceneRect()。这将相应地调整滚动条的范围。请注意,尽管场景支持几乎无限的大小,但滚动条的范围永远不会超过整数范围(INT_MIN, INT_MAX)。
  3. QGraphicsView通过调用render()来可视化场景。默认情况下,项目通过常规QPainter绘制到视口上,并使用默认的渲染提示。要更改QGraphicsView在绘制项目时传递给QPainter的默认渲染提示,可以调用setRenderHints()。
  4. 默认情况下,QGraphicsView为视口部件提供了一个常规的QWidget。可以通过调用viewport()访问此部件,或者通过调用setViewport()替换它。要使用OpenGL进行渲染,只需调用setViewport(new QGLWidget)。QGraphicsView将拥有视口部件的所有权。
  5. QGraphicsView支持仿射变换,使用QTransform。可以通过调用setTransform()传递一个矩阵,或通过调用方便函数rotate()、scale()、translate()或shear()之一。最常见的变换是缩放,用于实现缩放,和旋转。在转换过程中,QGraphicsView将视图的中心保持固定。由于场景对齐(setAligment()),平移视图将没有视觉影响。
  6. 可以使用鼠标和键盘与场景上的项目进行交互。QGraphicsView将鼠标和键盘事件转换为场景事件(继承自QGraphicsSceneEvent的事件),并将它们转发到可视化的场景。最后,处理事件并对它们作出反应的是各个项目。例如,如果点击可选择的项,该项通常会让场景知道它已被选中,并且它将重新绘制自己以显示选择矩形。同样,如果点击并拖动鼠标来移动可移动的项,则是处理鼠标移动并移动自身的项。默认启用项目交互,可以通过调用setInteractive()来切换它。
  7. 还可以通过创建 QGraphicsView 的子类并重新实现鼠标和按键事件处理程序来提供自己的自定义场景交互。为了简化与视图中的项目进行编程式交互的方式,QtGraphicsView提供了映射函数mapToScene()和mapFromScene(),以及项目访问器items()和itemAt()。这些功能允许在视图坐标和场景坐标之间映射点、矩形、多边形和路径,并使用视图坐标在场景中查找项目。

用法

#include <QApplication>  
#include <QGraphicsView>  
#include <QGraphicsScene>  
#include <QGraphicsEllipseItem>  
#include <QGraphicsRectItem>  
  
int main(int argc, char *argv[])  
{  
    QApplication app(argc, argv);  
  
    // 创建一个QGraphicsScene对象  
    QGraphicsScene scene;  
  
    // 创建一个椭圆形的QGraphicsEllipseItem对象,并设置其位置和大小  
    QGraphicsEllipseItem *ellipse = scene.addEllipse(QRectF(-50, -50, 100, 100));  
    ellipse->setPos(0, 0);  
  
    // 创建一个矩形的QGraphicsRectItem对象,并设置其位置和大小  
    QGraphicsRectItem *rect = scene.addRect(QRectF(-50, -50, 100, 100));  
    rect->setPos(150, 0);  
  
    // 创建一个QGraphicsView对象,并将QGraphicsScene对象设置为其场景  
    QGraphicsView view(&scene);  
    view.setRenderHint(QPainter::Antialiasing); // 设置抗锯齿渲染提示  
  
    // 显示QGraphicsView对象  
    view.show();  
  
    return app.exec();  
}

解释

在上面的示例中
首先,创建了一个QGraphicsScene对象,并向其中添加了一个椭圆形的QGraphicsEllipseItem对象和一个矩形的QGraphicsRectItem对象。
然后,创建了一个QGraphicsView对象,并将QGraphicsScene对象设置为其场景。
最后,显示QGraphicsView对象。
注意,在创建QGraphicsView对象时,使用了QPainter::Antialiasing渲染提示,这可以使得显示的图形更加平滑。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月23日 0

暂无评论

推荐阅读
yQAl4kecrO8W