图形视图框架QGraphicsView(视图,概念)

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) 将当前视图转换转换为 (shsv
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()来替换。

猜你喜欢

转载自blog.csdn.net/qq_45303986/article/details/129639179