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

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(历届)最新临沂... 1临沂市第一实验小学(临沂一小)2临沂市第二实验小学(临沂二小)3临沂市童星实验学校4临沂市红旗路实...
最新或2023(历届)最新日照... 1日照市实验小学  2日照市五莲县实验学校(小学部)  3日照市五莲县实验小学  4山东省五莲县实验...
最新或2023(历届)晋中市小... 最新或2023(历届)晋中榆次区小学一年级新生招生报名工作即将启动,晋中榆次区的很多家长关心最新或2...
最新或2023(历届)最新莱芜... 双峰联小电话:0634-6832300邮编:271104地址:莱芜市钢城区艾山街道办事处胡家宅村北卞...
最新或2023(历届)最新德州... 1、实验小学(含西区)省级规范化学校2、天衢东路小学, 省级规范化学校3、湖滨北路小学, 省级规范化...
【ConfluxNews】20... 【ConfluxNews】2023.3.20 ---------------------------...
java实现“数据平滑升级” 文章目录一、摘要二、前提场景说明:三、项目用到的脚本和代码1.项目目录长这样2.jav...
Collection和Map的... Collection和Map的三种不同的遍历方式Collection的三种遍历遍历方式Collect...
最新或2023(历届)最新烟台... 1烟台牟平区武宁镇陡崖子2烟台南通路小学3烟台养正小学4烟台市芝罘区潇翔小学5烟台市芝罘区祥发小学6...
最新或2023(历届)最新济宁... NO.1济宁学院附属小学上榜理由:济宁学院附小是1988年由济宁市政府建成的一所办学标准高、设施配备...
最新或2023(历届)最新泰安... 1、泰安市第一实验学校(小学部)2、泰安市岱岳区岳峰小学3、泰安市新泰市第一实验小学4、新泰市第一实...
最新或2023(历届)最新威海... 1威海市第二实验小学  2威海市实验小学  3威海经技区崮山中心小学  4威海经技区蒿泊小学  5威...
最新或2023(历届)最新潍坊... 1潍坊市实验小学  2潍坊市奎文区胜利东小学  3潍坊市奎文区先锋小学  4潍坊市奎文区实验小学  ...
JavaWeb——使用DBUt... 实验名称: 使用DBUtils实现数据库的增删改查操作                ...
如何做到深度思考? 1、什么是深度思考         深度思考是指对某个问题或主题进行深入、全面、系统的思考和探究。这...
最新或2023(历届)山西省小... 近年来“幼儿园复读现象”引发不小的争议,河北省政协委员吕铁元建议,把现行小学入学年满6周岁的规定修改...
最新或2023(历届)大同市小... 最新或2023(历届)大同城区小学一年级新生招生报名工作即将启动,大同城区的很多家长关心最新或202...
最新或2023(历届)阳泉市小... 最新或2023(历届)阳泉郊区小学一年级新生招生报名工作即将启动,阳泉郊区的很多家长关心最新或202...
最新或2023(历届)太原市小... 入学年龄凡年满六周岁的儿童,其父母或者其他法定监护人可送其入学接受并完成义务教育。太原幼升小入学注意...
最新或2023(历届)最新青岛... 家长必知:青岛小学排名一览表(前10名)最新或2023(历届),青岛实行划片就近入学政策,100%小...