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

QGraphicsItem 自定义是否被选中

一、默认模式

在Qt中,你可以通过设置 QGraphicsItem 的标志位(flags)来自定义图形项是否可以被选中。默认情况下,QGraphicsItem 是可以被选中的,除非你显式地禁用了这个功能。

以下是如何设置 QGraphicsItem 使其可以被选中的代码示例:

QGraphicsItem *item = new QGraphicsItem();
item->setFlag(QGraphicsItem::ItemIsSelectable, true); // 使图形项可以被选中

如果你想确保图形项始终处于选中状态,你可以使用 setSelected() 方法:

item->setSelected(true); // 设置图形项为选中状态

请注意,即使设置了 ItemIsSelectable 标志位,用户仍然需要通过与图形项交互(例如点击)来实际选中它。如果你想要图形项在创建时就自动被选中,你应该调用 setSelected(true)

另外,如果你想在图形项被选中时执行某些操作,你可以重新实现 QGraphicsItemmousePressEvent() 或其他相关的事件处理函数,并在其中调用 setSelected() 方法。

class CustomGraphicsItem : public QGraphicsItem {
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event) override {QGraphicsItem::mousePressEvent(event);setSelected(true); // 当鼠标按下时,设置图形项为选中状态
}
};

在这个例子中,当用户点击 CustomGraphicsItem 时,它会自动被设置为选中状态。

二、自定义图像模式

在 Qt 的 QGraphicsItem 框架中,如果您想要自定义的图形项能够被选择和交互,需要满足两个条件。这是因为 QGraphicsItem 的选择和交互机制依赖于其形状(shape)和边界矩形(bounding rectangle)来确定鼠标事件是否与其相关。

  1. 重写 QPainterPath shape() const override 方法

这个方法应该返回一个 QPainterPath,它紧密地包围了您的自定义图形。这个路径用于精确的碰撞检测和事件处理。如果您的自定义图形比较复杂,生成这个路径可能会有点复杂,但这是确保精确选择和高效事件处理的关键。

QPainterPath MyGraphicsItem::shape() const {  QPainterPath path;  // 根据您的图形项形状构建路径  // 例如,如果您的图形是一个矩形:  path.addRect(QRectF(0, 0, 100, 100));  return path;  
}
  1. 重写 QRectF boundingRect() const override 方法

这个方法应该返回一个 QRectF,它是包围您图形项的最小矩形。这个矩形用于快速剔除不在其范围内的鼠标事件,从而提高性能。通常,这个矩形应该比 shape() 方法返回的 QPainterPath 要大,因为它是一个简单的矩形,而 shape() 可以是任意形状。

QRectF MyGraphicsItem::boundingRect() const {  // 返回一个包含您图形项所有部分的矩形  return QRectF(0, 0, 100, 100);  
}

通过正确实现这两个方法,您的自定义 QGraphicsItem 就可以像其他标准 QGraphicsItem 一样被选择和交互了。当鼠标事件发生时,QGraphicsView 会首先检查事件位置是否在项的 boundingRect 内。如果是,则会进一步检查事件位置是否在 shape 内,以确定是否触发事件。这样,即使您的图形项形状复杂,也能确保正确的交互行为。

相关文章:

  • 人体接近传感器,ATM微波传感器,人体存在传感器 微波探测器YTMW8631
  • Python办公自动化—pandas读取Excel进行插入列、修改列的类型,apply函数与字典结合匹配等操作+完整代码
  • leetcode 二分查找·系统掌握 寻找比目标字母大的最小字母
  • 海思SS928/SD3403开发笔记1——使用串口调试开发板
  • PHP 命名空间
  • 基于Spring Boot+VUE职称评审管理系统
  • teamview的商业用途
  • Adobe XD是否收费?试试这几款超值的免费软件吧!
  • 本地运行大语言模型(LLMs)
  • Character Animator 2024 mac/win版:赋予角色生命,动画更传神
  • 北大oj Coins
  • 哈希表、哈希函数以及算法的时间复杂度和空间复杂度
  • tiaoshixitong
  • RTthread+STM32F407ZGTx+烟雾报警检测+蜂鸣器报警+LED闪烁||使用RTthread Studio
  • Linux安全:保护你的数字堡垒
  • 30天自制操作系统-2
  • Angular4 模板式表单用法以及验证
  • Docker入门(二) - Dockerfile
  • DOM的那些事
  • mysql外键的使用
  • WePY 在小程序性能调优上做出的探究
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 代理模式
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 聊聊hikari连接池的leakDetectionThreshold
  • 排序算法之--选择排序
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 由插件封装引出的一丢丢思考
  • 原生Ajax
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # 数仓建模:如何构建主题宽表模型?
  • #{}和${}的区别是什么 -- java面试
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #pragma预处理命令
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (1) caustics\
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (二)PySpark3:SparkSQL编程
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (五)关系数据库标准语言SQL
  • (一)Neo4j下载安装以及初次使用
  • (转)Windows2003安全设置/维护
  • (转载)Linux网络编程入门
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .net 反编译_.net反编译的相关问题
  • .net 受管制代码
  • .net反混淆脱壳工具de4dot的使用
  • .NET开源项目介绍及资源推荐:数据持久层
  • @RequestBody与@RequestParam
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ Linux ] Linux信号概述 信号的产生