如何看懂 Ely Prism Launcher 的分组实例视图?InstanceView 数据模型完整架构解析
【免费下载链接】LauncherThis fork of Prism Launcher adds integrated support for Ely.by accounts.项目地址https://gitcode.com/GitHub_Trending/ely/Launcher点击查看免费下载Ely Prism Launcher 是 Prism Launcher 的增强分支内置 Ely.by 账号支持。它的左侧主界面把 Minecraft 实例以分组卡片的形式展示可以折叠、拖拽换组、按名称或游玩时长排序。本文带你从零理解支撑这一体验的InstanceView 分组数据模型架构包括 InstanceList 数据层、InstanceProxyModel 代理层与 InstanceView 视图层是如何协作的。三层架构总览Model-Proxy-View 分工很多新手会误以为实例列表只是一个 QListView。实际上 Ely Prism Launcher 采用了经典的三层结构层类职责数据层InstanceList继承QAbstractListModel持有所有实例对象提供名称、图标、所在分组GroupRole等数据代理层InstanceProxyModel继承QSortFilterProxyModel负责排序先按分组名 locale 排序组内再按用户选定的排序方式视图层InstanceView继承QAbstractItemView把扁平的一维数据渲染成带分组标题的二维卡片网格处理折叠/展开、拖拽换组这种数据是平的、展示是分组的设计正是 Qt Model/View 框架的精髓数据模型不需要知道任何布局信息视图也不需要复制一份数据。组装这三层的代码位于 MainWindow.cpp第 328 行proxymodel-setSourceModel(APPLICATION-instances())把 InstanceList 接入代理模型第 332 行view-setModel(proxymodel)让 InstanceView 消费代理模型第 333~335 行注入分组折叠状态来源并连接groupStateChanged信号回写数据层数据层解析GroupRole 是分组的关键InstanceList在标准 Qt 角色之外定义了自定义角色见 InstanceList.henum AdditionalRoles { GroupRole Qt::UserRole, // 该实例属于哪个组 InstancePointerRole ..., // 返回 BaseInstance 指针 InstanceIDRole ... // 返回实例 ID };data()中case GroupRole直接返回getInstanceGroup(pdata-id())InstanceList.cpp分组关系存储在m_instanceGroupIndex实例 ID → 组名 的 QMap中未分组的实例返回空字符串视图中显示为 Ungrouped重命名、删除分组renameGroup/deleteGroupInstanceList.cpp后会精确地emit dataChanged(..., { GroupRole })只有分组角色变化才通知视图重排避免全量刷新 提示m_collapsedGroups集合记录了哪些分组处于折叠状态isGroupCollapsed()供视图在重建布局时恢复折叠记忆。代理层InstanceProxyModel 的分组感知排序InstanceProxyModel 虽然只有 70 多行却决定了你在界面上看到的顺序构造时第 25~31 行配置QCollator开启NumericMode自然排序2 排在 10 前、忽略大小写、跟随系统 localelessThan()第 42~56 行实现两级排序先比较两者的GroupRole值——不同组之间按组名 locale 排序让同组实例天然聚在一起同组内调用subSortLessThan()根据设置项InstSortMode在名称 / LastLaunch最近启动/ Playtime游玩时长三种模式间切换视图层核心InstanceView 如何把扁平数据变成分组网格InstanceView是整个模块中最复杂的类约 1000 行实现。关键设计有两点1. 用 GroupRole 现场聚合出视觉分组布局在updateGeometries()中完成InstanceView.cpp遍历模型每一行读取InstanceViewRoles::GroupRole角色枚举定义在 InstanceView.h用QMapLocaleString, VisualGroup*按组名去重聚合——LocaleString是覆写了operator的 QString 子类使 QMap 按键按 locale 感知排序保证分组标题顺序符合当前语言已存在的分组会复制旧对象new VisualGroup(old)从而保留折叠状态新分组则通过m_fVisibility回调即数据层的isGroupCollapsed初始化最后按组顺序累计高度调用updateScrollbar()设置滚动条范围2. VisualGroup分组内部的行流式布局每个分组内部的网格排布由 VisualGroup 负责VisualGroup持有rowsQListVisualRow每个VisualRow是一行内的若干QModelIndex加上行高、行顶偏移update()VisualGroup.cpp按itemsPerRow可用宽度 ÷ 卡片宽度随窗口 resize 实时重算把实例逐个流式填入各行行高取该组卡片中的最大高度hitScan()用位标志HitResultTextHit/CheckboxHit/HeaderHit/BodyHit回答鼠标点到了分组的哪个部位——这是折叠箭头点击、组内拖放定位的共同基础drawHeader()绘制分组标题箭头 加粗组名 淡色分隔线空分组名渲染为 Ungrouped折叠/展开与状态回写点击分组头部箭头时InstanceView.cpp 的mouseReleaseEvent完成闭环命中CheckboxHit时进入ExpandingState/CollapsingState按下瞬间箭头就已翻转交互即时释放鼠标时更新collapsedemit groupStateChanged(组名, 是否折叠)该信号连接到InstanceList::on_GroupStateChanged写入m_collapsedGroups持久化记忆拖拽换组一个跨层的完整手势拖动实例卡片放到另一个分组上涉及三个文件的协作视图层startDrag()把选中项渲染成 pixmap 并携带application/x-instanceid类型数据dropEvent()InstanceView.cpp用rowDropPos()解析落点属于哪个VisualGroup最终调用数据层setInstanceGroup(实例ID, 目标组名)InstanceList.cpp完成归属变更、计数更新、GroupRole变更通知并落盘细节与扩展点几何缓存m_geometryCacheQCache缓存行号 → 矩形visualRect()与indexAt()反复查询时避免重算任何数据变更都通过scheduleDelayedItemsLayout()合并为一次布局跨组键盘导航moveCursor()InstanceView.cpp实现了在分组间上下左右的完整键盘移动且自动跳过已折叠的分组无障碍支持AccessibleInstanceView 把分组网格暴露给屏幕阅读器currentChanged中还会发出QAccessible::Focus事件空态提示没有实例时paintEvent绘制 Welcome! Click Add Instance 的居中引导卡片彩蛋视图背景可绘制动态猫CatPainter由设置项TheCat控制核心文件清单文件说明InstanceView.h / InstanceView.cpp分组视图主体布局、交互、绘制、拖放VisualGroup.h / VisualGroup.cpp单个分组的行排布、头部绘制与命中检测InstanceProxyModel.cpp分组感知的两级排序与图标装饰InstanceList.h / InstanceList.cpp实例数据模型与分组持久化InstanceDelegate.h单个实例卡片的绘制与行内重命名MainWindow.cpp三层模型的装配点理解了扁平数据 GroupRole 聚合 视觉行流式布局这条主线你就能看懂 Ely Prism Launcher 分组实例视图的全部细节也能为自己项目的分组列表界面借鉴同一套设计。赞分享【免费下载链接】LauncherThis fork of Prism Launcher adds integrated support for Ely.by accounts.项目地址https://gitcode.com/GitHub_Trending/ely/Launcher点击查看免费下载相关推荐如何看懂 Ely Prism Launcher 的 macOS 沙盒实现SecurityBookmarkFileAccess 完整指南如何看懂 Ely Prism Launcher 的 macOS 沙盒实现SecurityBookmarkFileAccess 完整指南 Ely Prism LEly Prism Launcher实例数据模型MinecraftInstance与BaseInstance完整解读Ely Prism Launcher实例数据模型MinecraftInstance与BaseInstance完整解读 Ely Prism Launcher 是如何看懂 Ely Prism Launcher 的 POTranslatorPO 翻译文件本地化系统完整解析如何看懂 Ely Prism Launcher 的 POTranslatorPO 翻译文件本地化系统完整解析 如果你正在研究 Ely Prism Launch上一篇Gradio Textbox 前端组件演进全解从 CHANGELOG 到源码实现的 24 个关键版本下一篇如何快速上手React Hook Form5分钟内构建你的第一个表单创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

God‘s Eye View 快速上手教程:浏览器免费运行实时 3D 空间情报地球,从启动到座舱一次讲清

God‘s Eye View 快速上手教程:浏览器免费运行实时 3D 空间情报地球,从启动到座舱一次讲清

Gods Eye View 快速上手教程:浏览器免费运行实时 3D 空间情报地球,从启动到座舱一次讲清 【免费下载链接】gods-eye-view A spy satellite simulator in your browser, except the data is real. Live open source spatial intelligence on a photoreali…

2026/10/18 3:13:14 阅读更多 →
企业Agent落地六条路径复盘:从RAG增强到多Agent协同的选型指南

企业Agent落地六条路径复盘:从RAG增强到多Agent协同的选型指南

2026年过去了九个月,我把自己经手和持续跟踪的二十多个企业Agent落地项目全部做了一轮复盘。有跑得很顺的,有烂尾的,也有上线之后被业务方默默弃用的。这篇文章把这一轮复盘按落地方式归成六条典型路径,用真实案例和数据说话——不…

2026/10/18 3:13:14 阅读更多 →
Electron 深入浅出

Electron 深入浅出

目录一、Electron 概述二、Electron 架构1、Main 进程2、Renderer 进程3、Preload 脚本三、Electron 核心 API1、窗口管理2、IPC 通信3、文件与系统操作四、Electron 安全最佳实践(重点难点)1、禁用 NodeIntegration2、开启 Context Isolation3、使用 Pr…

2026/10/18 3:13:14 阅读更多 →

最新新闻

学习打卡功能开发实战:从表结构设计到线上踩坑全记录

学习打卡功能开发实战:从表结构设计到线上踩坑全记录

前段时间接了一个学习类App的项目,需求池里躺着一个编号3.10的任务,名字就四个字:学习打卡。当时团队里不少人都觉得,这不就是给用户一个按钮,每天点一下签个到吗?结果真进入开发阶段才发现,这个…

2026/10/18 4:39:33 阅读更多 →
AI敏捷招聘引擎:用行为数据和预测模型重构2026人才决策

AI敏捷招聘引擎:用行为数据和预测模型重构2026人才决策

我做了六年多的人力资源数字化系统建设,从最初的ATS选型到如今基于行为数据的预测模型,一路踩坑一路迭代,发现一个残酷的现实:传统的招聘方式,已经撑不起2026年的人才竞争了。你可能还在用"简历关键词匹配面试官直…

2026/10/18 4:39:32 阅读更多 →
告别帐号限制,OpenAI Codex 零基础速通,配合 Codex++ 完美解锁 TaoToken 配置

告别帐号限制,OpenAI Codex 零基础速通,配合 Codex++ 完美解锁 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 4:39:32 阅读更多 →
DH2URDF:机器人DH参数转URDF的自动映射与避坑指南

DH2URDF:机器人DH参数转URDF的自动映射与避坑指南

简介:DH2URDF 是一份将 Denavit-Hartenberg 参数表转换为统一机器人描述格式(URDF)的 JavaScript 工具资源,面向机器人建模、运动学仿真与 ROS 学习方向的开发者及学生。它解决的是手工编写 URDF 繁琐、易错的问题:只需…

2026/10/18 4:39:32 阅读更多 →
AI敏捷招聘引擎:从行为分析到预测模型的实操指南

AI敏捷招聘引擎:从行为分析到预测模型的实操指南

1. 2026年的人才战争,拼的是“预测能力”而非“筛选速度”这两年做招聘的同行应该都有同感:简历收得越来越多,但真正合适的人反而越来越难找。职位发布出去,24小时内涌入几百份简历,HR团队加班刷完,最后约面…

2026/10/18 4:39:32 阅读更多 →
园区网实训报告全流程:从VLAN规划到NAT配置

园区网实训报告全流程:从VLAN规划到NAT配置

每年实训季我都会收到一堆让人头大的报告,拓扑图贴得挺漂亮,配置命令密密麻麻占了好几页,但你随便挑一句问“为什么网关要放在核心交换机上”,对方多半答不上来。实训报告既然叫“报告”,它就不是配置命令的粘贴板。它…

2026/10/18 4:38:32 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →