【免费下载链接】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),仅供参考