- 桌面应用
【免费下载链接】goldendict-ng
The Next Generation GoldenDict
GoldenDict-ng 的收藏夹(Favorites)是用户管理高频查词条目的核心面板,它以「文件夹 + 词条」的树形结构组织内容,支持星标快捷添加/移除、词典组联动激活、拖放整理以及 XML/纯文本导入导出。本文以官方文档 website/docs/ui_favorites.md 为骨架,结合仓库源码深入讲解收藏夹的完整用法、活动文件夹机制、组关联规则、持久化格式与底层实现原理,读完即可将收藏夹用于个人词库整理、多语言分组查词与跨设备备份迁移。
收藏夹面板的入口与基本定位
收藏夹(Favorites)是一个独立的可停靠(Dock)面板,由FavoritesPaneWidget实现,其主体是一个基于QTreeView的树形控件(见 favoritespanewidget.hh)。树中每个节点分为三类:Root(根)、Folder(文件夹)、Word(词条),对应TreeItem::Type枚举。
面板可以通过主菜单View → Favorites(对应ui.favoritesPane->toggleViewAction())显示或隐藏,其标题栏固定显示 "Favorites:" 标签,便于在多个停靠面板中快速定位。默认情况下,收藏夹被设计为顶层文件夹与词条并列的树状结构,你可以完全通过右键上下文菜单手动创建文件夹,无需任何配置文件。
树形结构与基本操作
创建文件夹与词条
- 在收藏面板的空白处或任意条目上右键,选择Add folder即可新建文件夹,新文件夹默认命名为 "New folder",若重名则会以时间戳追加命名(见
addNewFolder实现,favoritespanewidget.cc),随后会自动进入编辑状态供重命名。 - 词条本身不需要手动添加:在查词窗口中,点击工具栏上的 ⭐(Add to Favorites)按钮,即可将当前查到的词条加入收藏夹,具体逻辑见后文「活动文件夹机制」。
- 收藏面板支持
ExtendedSelection多选模式,选中条目后按Delete键可批量删除,删除前会弹出确认对话框(受preferences.confirmFavoritesDeletion选项控制,见 config.hh)。 - 右键菜单还提供Copy Selected操作,将选中的词条以换行符拼接复制到系统剪贴板(
copySelectedItems,favoritespanewidget.cc);若选中的是文件夹,则递归收集其下全部词条文本。
拖放整理
词条与文件夹都可以通过直接拖放在树中移动或复制:模型层实现了mimeData/dropMimeData,内部使用自定义 MIME 类型application/x-goldendict-tree-items(定义于 favoritespanewidget.hh),树视图开启了DragDrop拖放模式并默认使用Qt::MoveAction。拖放时模型会做两项合法性检查(favoritespanewidget.cc):
- 不能将条目拖入其自身或后代文件夹(
haveAncestor检查,防止循环嵌套); - 目标位置已存在同名同类型条目时,Move 操作会被拒绝(
haveSameItem检查),避免树内重复。
从源码结构看,拖放同时支持MoveAction与CopyAction,因而既可以把条目移动归类,也可以复制一份到其他文件夹。
星标按钮与「活动文件夹」机制
工具栏上的 ⭐ 图标是整个收藏功能的快速入口,它的行为取决于当前「活动文件夹(active folder)」的状态:
- 默认状态(无活动文件夹):⭐ 只反映词条是否存在于最顶层(根目录)。此时词条已在顶层收藏,⭐ 显示为点亮状态(源码中使用
star.svg与激活态star_blue.svg两套图标,见 mainwindow.cc 与 icons 目录下的 star.svg、star_blue.svg)。 - 激活某个文件夹后:⭐ 的语义切换到该文件夹——它指示当前查词是否在该文件夹内;点击 ⭐ 则执行切换(toggle):已存在则从该文件夹移除,不存在则加入。这个"有则删、无则加"的逻辑由
addRemoveWordInActiveFav实现(favoritespanewidget.cc),它先通过isWordPresentFullPath判断存在性,再分别调用removeWordFullPath或addNewWordFullPath。
如何激活文件夹
在收藏树中选中某个文件夹后右键,菜单会出现两项动态选项:
- Activate folder:将该文件夹设为活动文件夹;
- Deactivate folder:取消激活(若该文件夹当前正是活动文件夹,菜单项会自动切换文案,见
showCustomMenu与folderActivation,favoritespanewidget.cc)。
激活状态在界面上有直观反馈:活动文件夹的图标会从普通文件夹 folder.svg 切换为高亮的激活态图标(:/icons/folder_active,见data()的Qt::DecorationRole分支,favoritespanewidget.cc)。同时,程序通过GlobalBroadcaster::isWordPresentedInFavorites把"当前词是否已在活动文件夹中"暴露给主窗口,用于实时刷新星标状态(mainwindow.cc)。
词典组与收藏文件夹联动
收藏夹与**词典组(Group)**深度集成:每个词典组可以关联一个收藏文件夹(Group::favoritesFolder字段,见 config.hh)。其效果是:
- 切换组时,关联文件夹被自动激活:主窗口在切换词典组时调用
trySetCurrentActiveFav(igrp->favoritesFolder.split('/')),把组的favoritesFolder按/拆分为路径并尝试激活(mainwindow.cc)。若对应文件夹不存在则激活失败并保持原状。 - 简单用法:直接填写一个已有文件夹的名字,例如
food。 - 嵌套文件夹:使用
/作为路径分隔符,例如english/food/spicy、spanish/greetings。源码中TreeItem::fullPath()逐级向上收集节点名称得到完整路径,getModelIndexByFullPath则按路径逐层查找文件夹(favoritespanewidget.cc)。
组与文件夹的关联配置在编辑组对话框中完成:界面上的 "Favorites folder" 输入框读写group.favoritesFolder,保存时还会把用户误输入的反斜杠\统一替换为正斜杠/(edit_groups_widgets.cc),保证 Windows 用户习惯的路径写法也能正确解析。
这样的设计让「按组查词 + 按组收藏」成为一条顺畅的工作流:例如英语组关联english文件夹、西班牙语组关联spanish/greetings文件夹,切换词典组即自动切换收藏目标,无需手动反复激活。
导入与导出
除了在面板内增删条目,收藏夹还支持通过上下文菜单或主菜单进行整体导入导出。菜单项Import Favorites与Export Favorites的完整实现位于 mainwindow.cc:
- Export(导出):可选择保存为**纯文本(.txt)**或XML(.xml)文件。导出后状态栏会短暂提示 "Favorites export complete"。
- Import(导入):读取 .txt 或 .xml 文件,当前收藏内容将被导入内容整体替换(不是合并)。导入完成后状态栏提示 "Favorites import complete"。注意界面在选择导入文件时同时支持
*.txt *.xml,若选择 TXT 文件则按纯文本解析,否则按 XML 解析。
重要区别:当前版本中,XML 格式会保留完整的文件夹层级结构,而纯文本格式不会——纯文本导入导出只能表达扁平的词条列表。
两种格式的细节
XML 格式内部结构与收藏夹的磁盘存储格式一致(见storeFolder/addFolder,favoritespanewidget.cc),典型结构如下:
<?xml version="1.0" encoding="UTF-8"?> <root> <folder name="english" expanded="1"> <folder name="food"> <headword>apple</headword> <headword>spicy</headword> </folder> <headword>hello</headword> </folder> <headword>gracias</headword> </root><folder name="..." expanded="0|1">:文件夹节点,expanded属性记录上次展开/折叠状态,重启后自动恢复;<headword>词条</headword>:词条节点,文本内容即词条名。
纯文本格式则是一行一个词条(getDataInPlainText将全部词条按换行符\n连接,favoritespanewidget.cc),导出时文件会写入UTF-8 BOM(EF BB BF),以保证在 Windows 记事本等工具中正确显示;导入时按换行拆分并忽略空行(setDataFromTxt,favoritespanewidget.cc)。
持久化与底层存储
收藏数据并非仅存在于内存中,而是持久化为一个独立文件,由Config::getFavoritiesFileName()返回,路径为用户主目录下的favorites文件(config.cc):
QString getFavoritiesFileName() { return getHomeDir().filePath( "favorites" ); }- 该文件是XML 格式(与上述导出 XML 同构),
FavoritesModel构造时通过readData()读取(favoritespanewidget.cc); - 自动保存:程序按
preferences.favoritesStoreInterval(默认15 分钟,见 config.hh)周期性调用saveData();每次变更后模型会标记dirty,只有存在未保存改动时才真正写盘(saveData使用QSaveFile原子写入,favoritespanewidget.cc)。偏好设置界面也提供该间隔的配置项,修改后即时生效(mainwindow.cc); - 容错处理:若
favorites文件损坏(XML 解析失败),程序会弹出警告对话框,并将损坏文件重命名为favorites.时间戳.bad后重新开始,避免启动卡死(favoritespanewidget.cc)。
这意味着:你可以把主目录下的favorites文件直接作为备份/迁移的素材,或借助「导入导出」功能在不同设备间同步收藏夹;结合 便携模式(Portable Mode) 的目录重定向机制,还可让收藏数据随程序目录一起移动。
小结与实用建议
- 日常收藏:查词时直接点工具栏 ⭐;默认收藏到顶层,右键激活某个文件夹后则定向收藏到该文件夹。
- 多语言/多场景管理:为每个词典组(如英语、西语、考研词表)创建一个顶层文件夹,并在组设置中填写对应文件夹名(嵌套用
/分隔),切换组即自动切换收藏目标。 - 整理:拖放移动条目、右键删除(Delete 键)或复制;文件夹可嵌套任意层。
- 备份与迁移:用主菜单 Export 导出为XML(推荐,保留文件夹结构)或 TXT(仅词条列表);导入会整体替换当前收藏,操作前请先导出备份。
收藏夹的实现代码集中在 favoritespanewidget.cc(模型与交互)、mainwindow.cc(菜单、工具栏与组联动)与 config.hh(配置项),如需二次开发或深挖行为细节,可从这三处入手。
- 桌面应用
【免费下载链接】goldendict-ng
The Next Generation GoldenDict
相关推荐
TiXL 渲染导出指南:Output Target 输出目标配置(文件夹、文件名与自动版本管理)
TiXL 渲染导出指南:Output Target 输出目标配置(文件夹、文件名与自动版本管理) TiXL(Tooll 3)的 Render To File 面
音视频图形学桌面应用massCode代码片段组织完全指南:文件夹、标签与分片管理
massCode代码片段组织完全指南:文件夹、标签与分片管理 massCode是一款功能强大的开源代码片段管理工具,专门为开发者设计,帮助您高效组织和管理代码片
开发工具桌面应用SumatraPDF 收藏夹(Favorites)完全指南:添加、侧栏、命令面板与工具栏按钮配置
SumatraPDF 收藏夹(Favorites)完全指南:添加、侧栏、命令面板与工具栏按钮配置 收藏夹(Favorites)是 SumatraPDF 内置的文
桌面应用文档
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考