当前位置: 首页 > news >正文

图形视图框架QGraphicsScene(场景,概念)

QGraphicsScene

该类充当 QGraphicsItems 的容器。它与 QGraphicsView 一起使用,用于在 2D 表面上可视化图形项目,例如线条、矩形、文本甚至自定义项目。

QGraphicsScene具有的功能:

  1. 提供用管理大量数据项的高速接口
  2. 传播事件到每一个图形项
  3. 管理图形项的状态,比如选择和处理焦点
  4. 提供无变换的渲染功能,主要用于打印

QGraphicsScene的函数(方法):

添加项目:

addElllipse()

创建一个椭圆项添加到项目中

返回QGraphicsEllipseItem*

addItem()

添加项目,使用QGraphicsItem*添加

addLine()

创建一个线段项添加到项目中

返回QGraphicsLineItem*

addPath()

创建一个路径项添加到项目中

返回QGraphicsPathItem*

addPixmap()

创建一个图片项添加到项目中

返回QGraphicsPixmapItem*

addPolygon()

创建一个多边形项添加到项目中

返回QGraphicsPolygonItem*

addRect()

创建一个矩形项添加到项目中

返回QGraphicsRectItem*

addText()

创建一个文本项添加到项目中

返回QGraphicsTextItem*

addSimpleText()

创建一个图片项添加到项目中

返回QGraphicsSimpleTextItem*

addWidget()

创建一个控件添加到项目中

返回QGraphicsProxyWidgetItem*

addItem()等之后介绍QGriphicsItem时再介绍 

可以直接使用除addItem()的函数来创建指定形状的项目。

#include <QApplication>
#include<QGraphicsScene>
#include<QGraphicsView>
#include<QGraphicsItem>
#include<QPushButton>
int main(int argc, char *argv[])
{QApplication a(argc, argv);QGraphicsScene scene;//创建一个场景scene.setSceneRect(-200,-200,400,400);//设置矩形场景大小//绘制圆形QGraphicsItem* item=scene.addEllipse(QRectF(50,50,50,50),QPen(QColor(Qt::red)),QColor(Qt::lightGray));//绘制文字QGraphicsItem* item2=scene.addText("Text",QFont("宋体",12));//绘制线段QGraphicsItem* item3=scene.addLine(QLineF(0,50,100,100),QPen(QColor(Qt::blue)));//添加控件QPushButton *push1=new QPushButton("按键");scene.addWidget(push1);//添加控件QGraphicsView view;//视图,下一节会仔细介绍view.setScene(&scene);//设置场景view.resize(600,600);//设置视图大小view.show();//显示return a.exec();
}

获取项目:

itemAt()返回指定位置处最顶层的可见项,或者如果此位置没有项返回nullptr
items()返回场景中所有项的有序列表
itemsBoundingRect()计算并返回场景中所有项的边界矩形

这里主要介绍一下items(),该函数有多个重载:

QList<QGraphicsItem*>QGraphicsScene::items(Qt:SortOrder)//可以设置堆叠顺序:

  • Qt::AscendingOrder 项目按升序排序
  • Qt::DescendingOrder 降序

QList<QGraphicsItem*>QGraphicsScene::items(const QPointF,Qt::ItemSelectionModel,Qt::SortOrder,const QTransFrom)

  • 第一个参数为:点位
  • 第二个参数为:指定如何选择项目
  • 第三次参数为:排序
  • 第四个参数为:坐标变换

其中第一个参数还可以为:QRectF,QPolygonF,QPainterPath

Qt::ItemSelectionModel

Qt::ContainsItemShape输出列表仅包含其形状完全包含在选择区域中的项。不包括与区域轮廓相交的项目。
Qt::IntersectsItemShape输出列表既包含其形状完全包含在选择区域内的项目,也包含与区域轮廓相交的项目。这是橡皮筋选择的常见模式。
Qt::ContainsItemBoundingRect输出列表仅包含其边框完全包含在选择区域内的项目。不包括与区域轮廓相交的项目。
Qt::IntersectsItemBoundingRect输出列表既包含其边框矩形完全包含在选择区域内的项目,也包含与区域轮廓相交的项目。此方法通常用于确定需要重绘的区域。

 焦点、活动:

activePanel()

setActivePanel()

返回当前活动面板,返回的数据类型为:QGraphicsItem*

激活指定窗口

activeWindow()

setActiveWindow()

返回当前活动窗口,返回的数据类型为:QGraphicsWidget*

激活指定窗口

isActive()是否是活跃的

bspTreeDepth()

setBspTreeDepth()

场景的BSP索引树的深度,深度直接影响场景的性能和内存使用率;后者随着树的深度呈指数增长
clearFous()清空焦点

focusItem()

setFocusItem()

焦点上的项目

focusOnTouch

setFocusOnTouch(bool)

保存项目在接收触摸开始事件时是否获得焦点(Qt 5.12)
hasFocus()场景是否拥有焦点
setFocus()设置焦点,已具有焦点,则此函数不执行任何操作
removeItem()移除项目
selectedItems()返回所有当前选定项的列表。这些项目不按特定顺序返回

selectionArea()

setSelectionArea()

选择区域

stickyFocus()

setstickyFocus()

单击场景背景是否会清除焦点
update(QRectF)更新数据
views()获取所有视图的列表

字体、背景和基本属性:

backgroundBrush()

setBackgroundBrush()

背景笔刷

font()

setFont()

字体

style()

setStyle()

场景样式

foregroundBrush()

SetForeGroundBrush()

场景的前景画笔

palette()

setPalette()

调色板

sceneRect()

setSceneRect()

场景矩形

height() 相当于 sceneRect().height()

widget()相当于 sceneRect().widge()

场景高度和宽度

minimunRenderSize()

SetMinimunRenderSize()

最小渲染大小,(Qt 5.4)

默认值为 0。如果未设置,或者设置为 0 或负值,将始终呈现所有项目。

reader()使用绘制器矩形从场景渲染到目标。此功能可用于将场景内容捕获到绘画设备(例如,截图)或使用 QPrinter 进行打印
QGraphicsScene scene;//创建一个场景//设置矩形场景大小scene.setSceneRect(-200,-200,400,400);//设置字体scene.setFont(QFont("Times", 10, QFont::Bold));//设置背景scene.setBackgroundBrush(QColor(255,255,0,100));//设置前场笔刷scene.setForegroundBrush(QBrush(QColor(20,20,20,20)));//设置调色板scene.setPalette(QPalette(QPalette::Shadow));

其他:

collidingItems()返回与项冲突的所有的列表,一般用于碰撞
contextMenuEvent()对于事件上下文菜单事件,此事件处理程序可以在子类中重新实现以接收上下文菜单事件
destroyItemGrop()将组中的所有项目重定父级到组的父项,然后从场景中删除,最后将其删除。项目的位置和转换将从组映射到组的父级
mouseGrabberItem()返回当前鼠标抓取器项,或者如果当前没有项正在抓取鼠标返回true
setItemIndexMethod()设置场景的索引算法
invalidate()使场景中的矩形图层重新绘制无效并计划重绘。图层中的任何缓存内容都将无条件失效并重新绘制。

 ItemIndexMethod:

QGraphicsScene::BspTreeIndex应用二进制空间分区树,场景所有项目位置算法都是接近对数复杂度的量级,通过使用二进制搜索。添加、移动和删除项目是对数的。此方法最适合静态场景(即大多数项目不移动的场景)。
QGraphicsScene::NoIndex不应用任何索引项目位置具有线性复杂性,因为将搜索场景中的所有项目。但是,添加、移动和删除项目是在恒定的时间内完成的。此方法非常适合连续添加、移动或删除许多项目的动态场景。

SceneLayer(项目的渲染层)

QGraphicsScene::ItemLayer项目图层,通过调用虚拟函数 drawItems() 来渲染此层中的所有项目。项目图层在背景图层之后绘制,但在前景图层之前绘制。
QGraphicsScene::BackgroundLayer背景图层,通过调用虚拟函数 drawBackground() 在此层中渲染场景的背景。首先绘制所有图层的背景图层。
QGraphicsScene::ForegroundLayer前景图层,通过调用虚拟函数 drowForeground() 在此层中渲染场景的前景。前景图层是所有图层的最后一个绘制的。
QGraphicsScene::AllLayers所有层;此值表示所有三个图层的组合。

公共插槽:

advance()

将场景进一步推进,这分两个阶段完成:在第一阶段,通知所有项目场景即将更改,在第二阶段,所有项目都会收到它们可以移动的通知。用于动画

clear()从场景中移除和删除所有项目,但保持场景状态不变
clearSelection()清除当前所选内容
invalidate()使场景中的矩形图层重新绘制无效并计划重绘。图层中的任何缓存内容都将无条件失效并重新绘制。
update(QRectF)计划在场景中重绘区域直角

信号:

changed()如果场景内容发生更改时,触发信号
foucusItemChanged()焦点发生变化时,触发信号
sceneRectChanged()景矩形发生变化时,触出信号
selectionChanged()每当选择更改时,触发信号

QGraphicsScene的使用方法:

  • QGraphicsScene 没有自己的视觉外观;它仅管理项目,需要创建一个QGraphicsView来显示可视化场景
  • QGraphicsScene最大的优势之一是它能够有效地确定物品的位置。即使场景中有数百万个项目,items() 函数也可以在几毫秒内确定项目的位置。

这里就不具体介绍使用方法,使用方法会在QGraphicsView和QGraphicsItem中主要介绍。 

参考资料:

QGraphicsScene Class | Qt Widgets 5.15.13

相关文章:

图形视图框架QGraphicsScene(场景,概念)

QGraphicsScene 该类充当 QGraphicsItems 的容器。它与 QGraphicsView 一起使用&#xff0c;用于在 2D 表面上可视化图形项目&#xff0c;例如线条、矩形、文本甚至自定义项目。 QGraphicsScene具有的功能&#xff1a; 提供用管理大量数据项的高速接口传播事件到每一个图形项…...

ChatGPT 拓展资料: 强化学习-SARSA算法

强化学习是一种机器学习技术,它关注的是在特定环境中,如何最大化一个智能体(agent)的累积奖励(reward)。强化学习算法会根据当前状态和环境的反馈来选择下一个动作,不断地进行试错,从而优化智能体的行为。 SARSA是一种基于强化学习的算法,它可以用于解决马尔可夫决策…...

SpringJDBC异常抽象

前言spring会将所有的常见数据库的操作异常抽象转换成他自己的异常&#xff0c;这些异常的基类是DataAccessException。DataAccessException是RuntimeException的子类&#xff08;运行时异常&#xff09;,是一个无须检测的异常,不要求代码去处理这类异常SQLErrorCodeSQLExcepti…...

我在字节的这两年

前言 作为脉脉和前端技术社区的活跃分子&#xff0c;我比较幸运的有了诸多面试机会并最终一路升级打怪如愿来到了这里。正式入职时间为2021年1月4日&#xff0c;也就是元旦后的第一个工作日。对于这一天&#xff0c;我印象深刻。踩着2020年的尾巴接到offer,属实是过了一个快乐…...

Button(按钮)与ImageButton(图像按钮)

今天给大家介绍的Android基本控件中的两个按钮控件,Button普通按钮和ImageButton图像按钮; 其实ImageButton和Button的用法基本类似,至于与图片相关的则和后面ImageView相同,所以本节只对Button进行讲解,另外Button是TextView的子类,所以TextView上很多属性也可以应用到B…...

Chrome插件开发-右键菜单开启页面编辑

开发一个执行js脚本改变页面DOM的Chrome插件&#xff0c;manifest_version版本为3。 Chrome插件基本知识 Chrome插件通常由以下几部分组成&#xff1a; manifest.json 该文件为必须项&#xff0c;其它文件都是可选的。该文件相当于插件的meta信息&#xff0c;包含manifest版…...

指针进阶(上)

内容小复习&#x1f431;&#xff1a; 字符指针:存放字符的数组 char arr1[10]; 整型数组:存放整型的数组 int arr2[5]; 指针数组:存放的是指针的数组 存放字符指针的数组(字符指针数组) char* arr3[5]; 存放整型指针的数组(整型指针数组) int* arr[6]; 下面进入学习了哦~&…...

Python每日一练(20230318)

目录 1. 排序链表 ★★ 2. 最长连续序列 ★★ 3. 扰乱字符串 ★★★ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 排序链表 给你链表的头结点 head &#xff0c;请将其按 升序 …...

多层多输入的CNN-LSTM时间序列回归预测(卷积神经网络-长短期记忆网络)——附代码

目录 摘要&#xff1a; 卷积神经网络(CNN)的介绍&#xff1a; 长短期记忆网络&#xff08;LSTM&#xff09;的介绍&#xff1a; CNN-LSTM&#xff1a; Matlab代码运行结果&#xff1a; 本文Matlab代码数据分享&#xff1a; 摘要&#xff1a; 本文使用CNN-LSTM混合神经网…...

mybatis中获取参数的两种方式:${}和#{}

目录 1.#{} 2.${} 3.总结 1.#{} 本质是占位符赋值 示例及执行结果&#xff1a; 结论&#xff1a;通过执行结果可以看到&#xff0c;首先对sql进行了预编译处理&#xff0c;然后再传入参数&#xff0c;有效的避免了sql注入的问题&#xff0c;并且传参方式也比较简单&#xf…...

复制带随机指针的复杂链表

目录一、题目题目链接二、题目分析三、解题思路四、解题步骤4.1 复制结点并链接到对应原节点的后面4.2 处理复制的结点的随机指针random4.3 分离复制的链表结点和原链表结点并重新链接成为链表五、参考代码六、总结一、题目题目链接 ​​​​ ​ 题目链接&#xff1a;https://…...

【基于协同过滤算法的推荐系统项目实战-2】了解协同过滤推荐系统

本文目录1、推荐系统的关键元素1.1 数据1.2 算法1.3 业务领域1.4 展示信息2、推荐算法的主要分类2.1 基于关联规则的推荐算法基于Apriori的算法基于FP-Growth的算法2.2 基于内容的推荐算法2.3 基于协同过滤的推荐算法3、推荐系统常见的问题1、冷启动2、数据稀疏3、不断变化的用…...

线程安全(重点)

文章目录一.线程安全的概念1.1 线程安全的概念1.2 线程不安全的原因1.3 解决线程不安全二.synchronized-monitor lock(监视器锁)2.1 synchronized的特性(1)互斥(2)刷新内存(3)可重入2.2 synchronied使用方法1.直接修饰普通方法:2.修饰静态方法:3.修饰代码块:三.死锁3.1死锁的情…...

软件测试面试找工作你必须知道的面试技巧(帮助超过100人成功通过面试)

目录 问题一&#xff1a;“请你自我介绍一下” 问题二&#xff1a;“谈谈你的家庭情况” 问题三&#xff1a;“你有什么业余爱好?” 问题四&#xff1a;“你最崇拜谁?” 问题五&#xff1a;“你的座右铭是什么?” 问题六&#xff1a;“谈谈你的缺点” 问题七&#xff…...

Python快速入门:类、文件操作、正则表达式

类、文件操作、正则表达式1. 类2. 文件操作3. 正则表达式1. 类 类是用来描述具有相同的属性和方法的集合&#xff0c;定义了该集合中每个对象共有的属性和方法&#xff0c;对象是类的实例&#xff0c;可以调用类的方法。 定义类时&#xff0c;如有父类&#xff0c;则写在类名…...

java-day01

程序就是有序指令的集合 cmd执行java程序&#xff0c;javac Test.java&#xff0c;java Test java技术平台&#xff1a; javaSE标准版&#xff0c;javaEE企业版&#xff0c;javaME小型版 java语言面向对象的&#xff08;oop&#xff09;&#xff0c;java跨平台性的&#xff08;…...

玩转 Node.js 集群

一、介绍 Node 在 v0.8 时直接引入了 cluster 模块&#xff0c;用以解决多核 CPU 的利用率问题&#xff0c;同时也提供了较完善的 API&#xff0c;用以处理进程的健壮性问题。 cluster 模块调用 fork 方法来创建子进程&#xff0c;该方法与 child_process 中的 fork 是同一个…...

Day909.MySQL 不同的自增 id 达到上限以后的行为 -MySQL实战

MySQL 不同的自增 id 达到上限以后的行为 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于MySQL 不同的自增 id 达到上限以后的行为的内容。 MySQL 里有很多自增的 id&#xff0c;每个自增 id 都是定义了初始值&#xff0c;然后不停地往上加步长。 虽然自然数是没有…...

JVM学习.01 内存模型

1、前言对于C、C程序员来说&#xff0c;在内存管理领域&#xff0c;他们拥有对象的“所有权”。从对象建立到内存分配&#xff0c;不仅需要照顾到对象的生&#xff0c;还得照顾到对象的消亡。背负着每个对象生命开始到结束的维护和管理责任。对于JAVA程序来说&#xff0c;因为J…...

R+VIC模型应用及未来气候变化模型预测

RVIC模型融合实践技术应用及未来气候变化模型预测在气候变化问题日益严重的今天&#xff0c;水文模型在防洪规划&#xff0c;未来预测等方面发挥着不可替代的重要作用。目前&#xff0c;无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然&…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Java线上CPU飙高问题排查全指南

一、引言 在Java应用的线上运行环境中&#xff0c;CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时&#xff0c;通常会导致应用响应缓慢&#xff0c;甚至服务不可用&#xff0c;严重影响用户体验和业务运行。因此&#xff0c;掌握一套科学有效的CPU飙高问题排查方法&…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...