QGraphicsView(图形视图)
QGraphicsView提供了视图部件,用来使场景中的内容可视化,可以连接多个视图到同一个场景中来为相同的数据集提供多个视口,视图部件是一个可滚动的区域,提供一个滚动条来浏览大的场景。
创建使用图形视图:
setSence() | 设置需要显示的场景 |
show() | 显示视图内容视图,将默认滚动到场景的中心 |
#include <QApplication>
#include<QGraphicsScene>
#include<QGraphicsView>
#include<QGraphicsItem>
#include<QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene(-200,-200,400,400);//创建一个场景
QGraphicsView view;//创建一个视图
view.setScene(&scene);//设置场景
view.show();//显示
return a.exec();
}
resize() | 设置视图的大小 |
使用resize()可以重置视图的大小,如果视图大小小于场景大小,重置后会添加滑动条 。
QGraphicsScene scene(-200,-200,400,400);//创建一个场景
QGraphicsView view;//创建一个视图
view.setScene(&scene);//设置场景
view.resize(400,400);
view.show();//显示
修改视图背景:
一个场景有三层:
- ItemLayer 图形项层
- ForegroundLayer 前景层
- BackgroundLayer 背景层
场景的绘制重视从被级层开始。
setForegroundBrush() | 设置前景色 |
setBackgroundBrush() | 设置背景 |
QGraphicsScene scene(-200,-200,400,400);//创建一个场景
QGraphicsView view;//创建一个视图
view.setScene(&scene);//设置场景
view.setForegroundBrush(QColor(255,255,0,100));//设置前景色
view.setBackgroundBrush(QPixmap(":/image/img.jpg"));
view.show();//显示
使用多个视图显示内容:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene(-200,-200,400,400);//创建一个场景
QGraphicsView view;//创建第一个视图
view.setScene(&scene);//设置场景
view.setForegroundBrush(QColor(255,255,0,100));//设置前景色
view.setBackgroundBrush(QPixmap(":/image/img.jpg"));
view.resize(600,600);
view.show();//显示
QGraphicsView view2;//创第二个视图
view2.setScene(&scene);//设置场景
view2.setForegroundBrush(QColor(255,255,0,10));//设置前景色
view2.setBackgroundBrush(QPixmap(":/image/img.jpg"));
view2.resize(600,600);
view2.show();//显示
return a.exec();
}
也可以使用场景中的前景和背景:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene(-200,-200,400,400);//创建一个场景
scene.setForegroundBrush(QColor(255,255,0,100));//设置前景色
scene.setBackgroundBrush(QPixmap(":/image/img.jpg"));
QGraphicsView view;//创建第一个视图
view.setScene(&scene);//设置场景
view.resize(600,600);
view.show();//显示
QGraphicsView view2;//创第二个视图
view2.setScene(&scene);//设置场景
view2.resize(600,600);
view2.show();//显示
return a.exec();
}
QGraphicsView的函数:
alignment() | 整个场景可见时场景中场景的对齐方式,默认居中 |
cacheMode() | 缓存模式,保存缓存视图的哪些部分 |
restCachedContent() | 重置所有缓存的内容。调用此函数将清除视图中的缓存 |
centerOn() | 滚动视区的内容以确保场景坐标位置在视图中居中 |
dargMode() | 拖动模式 |
ensureVisible() | 滚动视区的内容,以便场景矩形矩形可见。如果无法访问指定的矩形,则内容将滚动到最近的有效位置。两个边距的默认值均为 50 像素 |
fitlnView() | 缩放视图矩阵并滚动滚动条,以确保场景矩形矩形适合视口。rect 必须在场景内部,否则,fitInView() 不能保证整个矩形是可见的。 |
setInteractive(bool allowed) | 设置是否允许页面交互,默认true |
isTransFormed() restTransfrom() |
判断视图是否转换 将视图转换重置为单位矩阵 |
itemAt() | 返回位于视口坐标中的位置位置的项。如果此位置有多个项目,则此函数返回最顶层的项目 |
items() | 视图中位置位置的所有项的列表 |
mapFromScene() | 将场景坐标返回到视口坐标。 |
mapToScene() | 返回映射到场景坐标多边形的视区 |
optimizationFlags() | 优化标志 |
rotate() | 旋转 |
scale() | 缩放 |
shear(qreal sh,qreal sv) | 按 (sh, sv) 剪切当前视图转换 |
translate(qreal sh,qreal sv) | 将当前视图转换转换为 (sh, sv) |
rubberBandRect() | 用户当前正在使用橡皮筋进行项选择,则此函数返回当前橡皮筋区域 |
scene() | 返回场景 |
setTransfrom() | 将视图的当前转换矩阵设置为矩阵 |
对齐方式的使用:
QGraphicsView view;//创建第一个视图
view.setScene(&scene);//设置场景
view.setAlignment(Qt::AlignTop|Qt::AlignRight);对齐方式设置为右上角
view.resize(600,600);
view.show();//显示
cacheMode(缓存模式)
QGraphicsView::CacheNone | 所有绘画都直接在视口上完成 |
QGraphicsView::CacheBackground | 背景已缓存。这会影响自定义背景和基于 backgroundBrush()属性的背景。启用此标志后,QGraphicsView 将分配一个具有视区完整大小的像素图。 |
两者的区别:
缓存的目的是加快渲染速度较慢的区域的总渲染时间。例如,纹理、渐变和 Alpha 混合背景的渲染速度可能明显很慢;尤其是转换后的视图。但每次转换视图后缓存就会失效。
DragModel(拖动模式 )
此属性保存按下鼠标左键时将鼠标拖到场景上的行为
QGraphicsView::NoDrag | 忽略操作 |
QGraphicsView::ScrollHandDrag | 光标变为指向的指针,拖动鼠标将滚动条,适用于交互和非交互模式 |
QGraphicsView::RubberBandDrag | 将出现橡皮筋。拖动鼠标将设置橡皮筋几何形状,并选择橡皮筋覆盖的所有项目。对于非交互式视图,此模式处于禁用状态 |
第二个参数的使用:
使用鼠标拖动视图
QGraphicsView view2;//创建视图
view2.setScene(&scene);//设置场景
view2.setDragMode(QGraphicsView::ScrollHandDrag);
view2.resize(400,400);
view2.show();//显示
return a.exec();
第三个参数的使用:
类似于截图,获取指定区域的项目
QGraphicsView view2;//创建第一个视图
view2.setScene(&scene);//设置场景
view2.setDragMode(QGraphicsView::RubberBandDrag);
view2.resize(400,400);
view2.show();//显示
fitlnView()的详细介绍:
QGraphicsView::fitInView(const QRectF &rect, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio)
- QRectF为区域,当该区域为空,或视图太小时,不会执行任何操作
- Qt::AspectRatioMode 纵横比模式
Qt::AspectRatioMode
Qt::IgnoreAspectRatio | 大小可自由缩放。不保留纵横比。 |
Qt::KeepAspectRatio | 在给定矩形内,大小将缩放到尽可能大的矩形,从而保留纵横比 |
Qt::KeepAspectRatioByExpanding | 大小将缩放到给定矩形之外尽可能小的矩形,从而保留纵横比 |
rotate(旋转):
QGraphicsView view2;//创建第一个视图
view2.setScene(&scene);//设置场景
view2.rotate(60);//旋转60°
view2.resize(600,600);
view2.show();//显示
scale(缩放):
QGraphicsView view2;//创建第一个视图
view2.setScene(&scene);//设置场景
view2.scale(3,1);//缩放
view2.resize(600,600);
view2.show();//显示
QGraphicsView为视口小部件提供常规的QWidget,可以使用viewPort()来访问该小部件,也可以使用setViewport()来替换。