图形视图框架QGraphicsView(视图,概念)
创始人
2025-05-30 11:09:32

QGraphicsView(图形视图)

QGraphicsView提供了视图部件,用来使场景中的内容可视化,可以连接多个视图到同一个场景中来为相同的数据集提供多个视口,视图部件是一个可滚动的区域,提供一个滚动条来浏览大的场景。

创建使用图形视图:

setSence()设置需要显示的场景
show()显示视图内容视图,将默认滚动到场景的中心
#include 
#include
#include
#include
#include
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()来替换。

相关内容

热门资讯

朱元璋建立的卫所制度是怎么衰败... 朱元璋建立的卫所制度是怎么衰败的?有哪几方面的因素?下面趣历史小编就为大家带来详细介绍,接着往下看吧...
最新或2023(历届)蚌埠残疾... 残疾证是认定残疾人及残疾类别、等级的合法证件。凡符合《中国残疾人实用评定标准》的残疾人均应发给残疾人...
最新或2023(历届)芜湖残疾... 残疾证是认定残疾人及残疾类别、等级的合法证件。凡符合《中国残疾人实用评定标准》的残疾人均应发给残疾人...
桂林适合情侣去的地方,桂林适合... 桂林最常规的最有名气的就是大漓江和“三山一洞一公园”了。漓江的游览,您可以选择坐船,一般是从磨盘山码...
柳州适合情侣去的地方,柳州适合... 大龙潭  为国家4A级旅游景区,位于广西省柳州市,融喀斯特地貌、少数民族风情文化、亚热带岩溶植物景观...