QGraphicsView简介
QGraphicsView是QT的GUI库中提供的2D的图形视图框架(Graphics View Framework),用于管理数量比较大的2D图形,并且提供了较为丰富的交互方法。
QGraphicsView的使用离不开QGraphicsScene类,QGraphicsView只提供视图,用于加载、渲染和显示QGraphicsScene(场景),而QGraphicsScene则是真正用来管理所创建的2D图形项,两个类总是一起使用。
QGraphicsView类提供了平常我们常用的各种交互方式,如缩放、平移等。
本文就是介绍对QGraphicsView的一些常用的初始化的一些参数设置。
设置
这里采用的函数参数是常用的参数,实际上很多方法的参数有很多种选项,提供的交互方式也是不同的,这里只提供常用参水选项,其他的选项可以自己搞个demo看下差异。
启用交互模式:允许用户与显示的图形项进行交互操作,例如拖动、缩放、选择等。当交互模式被启用时,用户可以通过鼠标或触摸屏等方式与图形项进行交互,从而实现对图形场景的操作和控制
setInteractive(true);
启用抗锯齿:用于减少图形边缘的锯齿状效果,使得图形看起来更加平滑和清晰。通过启用抗锯齿渲染,绘制的图形将具有更高的视觉质量,特别是在绘制曲线、圆弧和斜线等图形时,可以减少锯齿状的边缘,提升图形的外观效果。
setRenderHint(QPainter::Antialiasing);
启用平滑的像素变换:用于在对图像进行缩放、旋转等变换操作时,保持图像的平滑性和质量。
setRenderHint(QPainter::SmoothPixmapTransform);
更改变换锚点:图形视图的变换锚点被设置为鼠标下方, 平移、缩放、旋转等变换操作时,变换的中心点将根据鼠标的位置而动态改变
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
更改大小调整锚点:QGraphicsView的调整大小锚点设置为鼠标所在位置。这意味着当用户调整QGraphicsView的大小时,锚点将位于鼠标指针所在的位置,从而使得调整大小的操作更加灵活和直观。
setResizeAnchor(QGraphicsView::AnchorUnderMouse);
修改更新方式:图形项发生变化时,整个视口将被完全更新,重新绘制所有的图形项
setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
修改拖拽方式:图形视图的拖拽模式被设置为滚动手势拖拽,使用鼠标或触摸手势来拖拽视图,实现滚动和平移的效果,总结一句话就是当场景的大小比视图大时,场景的右侧和下侧会出现滑动条,这时可以通过鼠标左击视图不松手然后移动鼠标可以实现平移场景的效果。
setDragMode(QGraphicsView::ScrollHandDrag);
关闭鼠标追踪:不管鼠标有没有按下按钮,都会追踪鼠标的移动,只要鼠标移动就会触发mouseMoveEvent的事件
setMouseTracking(false);
设置场景
QGraphicsScene* my_scene = new QGraphicsScene(this);
my_scene->setSceneRect(0, 0, 5000, 5000);
setScene(my_scene);
setSceneRect函数的四个参数分别是场景矩形大小的x坐标、y坐标、宽度、高度。当场景的宽高大于视图到的宽高的话,则视图会在右侧和下方出现滑动条来查看场景的其他区域。
显示滑动条
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
设置视图中心
centerOn(my_scene->sceneRect().center());
将QGraphicsView的视图中心定位到QGraphicsScene的矩形区域中心位置。在视图中心显示场景的中心内容。
关于QGraphicsScene的一些信息
我们在创建完成视图QGraphicsView且添加完QGraphicsScene后,在QGraphicsScene内添加图形项,这里需要注意的是,图形项真正的管理者是QGraphicsScene,而不是QGraphicsView,举个例子更容易理解:
假设我们当前创建了两个QGraphicsView,分别编号为view1和view2,我们在view1内添加一个QGraphicsScene(scene1),然后再QGraphicsScene内添加一些图形项,如果此时从view1内移除scene1,然后重新添加一个scene2,那么此时你看到的view1内是空白的,原来创建的图形项随着scene1的移除被移除。
如果此时view2添加scene1为自己的scene,那么就可以在view2内看到原来添加的图形项。
那么思考一个问题,如果view1和view2内都添加scene1为自己的scene,那么此时在view1内创建、移动图形项时,view2内是怎么样显示的?
答案是会和view1内显示的一样,看起来view2像是view1的复制体,所以还是那句话,scene才是所有图形项的管理者和储存者。
我会在下个博客内演示两个view添加同一个scene时,scene内添加一个图形项,怎么在view1内移动图形项时view内图形项不动。