news 2026/9/16 14:29:53

cool-retro-term字体列表API详解:如何获取和管理所有可用字体

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
cool-retro-term字体列表API详解:如何获取和管理所有可用字体

cool-retro-term字体列表API详解:如何获取和管理所有可用字体

【免费下载链接】cool-retro-termA good looking terminal emulator which mimics the old cathode display...项目地址: https://gitcode.com/GitHub_Trending/co/cool-retro-term

cool-retro-term 是一款复古 CRT 风格的终端模拟器,内置 20 多种怀旧与现代等宽字体。本文详解它的字体列表 API:如何通过FontManagerFontListModel获取、筛选和管理所有可用字体,涵盖内置字体注册表、系统字体扫描、过滤规则与 QML 端调用方式。

字体列表API的两大核心角色

cool-retro-term 的字体体系由两个 C++ 类协作完成,均在 app/main.cpp 中注册为 QML 类型:

职责源码
FontManager收集、筛选、切换字体,发出字体变更信号fontmanager.h
FontListModel以 Qt 列表模型形式暴露字体条目,供 QML 下拉框绑定fontlistmodel.h

💡FontListModel被声明为"不可直接创建"——它只能由FontManager内部生成,保证了数据来源的唯一性。

获取全部字体:两个列表属性

FontManager构造时会自动执行两次字体收集(见 fontmanager.cpp):

  1. 内置字体:通过populateBundledFonts()从应用资源中注册 Terminus、Hack、JetBrains Mono、Unscii 等 20 多种字体(populateBundledFonts);
  2. 系统字体populateSystemFonts()借助QFontDatabase扫描系统已安装字体,并只保留等宽(fixed-pitch)字体,同时跳过与内置字体同名的家族,避免重复(retrieveMonospaceFonts、populateSystemFonts)。

合并后的完整清单通过两个只读属性对外暴露:

  • fontList:全部字体的原始清单(m_allFonts);
  • filteredFontList:按当前配置过滤后的清单,这是界面实际使用的列表。

每个字体条目的完整字段

一条字体记录FontEntry包含 9 个字段(FontEntry 定义):

字段含义
name内部标识,如TERMINESS_SCALEDHACK
text下拉框中展示的显示名
source内置字体的资源路径;系统字体为空
baseWidth基础字宽(低清字体会自动计算修正)
pixelSize原生像素高度,低清字体为 8/11/16,现代字体为 32
lowResolutionFont是否为需放大的低分辨率像素字体
isSystemFont是否来自系统
familyQt 实际识别的字族名
fallbackName字符缺失时的后备字体

QML 侧通过模型的角色名(role name)访问这些字段,角色映射见 roleNames()。

获取单个字体详情:get(index) 方法

FontListModel提供了一个便捷的Q_INVOKABLE方法get(index),一次返回指定索引字体的完整属性字典(get() 实现)。它是 QML 里"按下标取一条字体"的标准入口:

var font = appSettings.filteredFontList.get(currentIndex) appSettings.fontName = font.name

⚠️ 注意:get()越界时返回空字典而非报错,QML 侧建议先用count属性校验范围。

过滤规则:为什么有时列表里"少了一些"字体

filteredFontList不是简单复制,updateFilteredFonts()(过滤逻辑)按两层条件筛选:

  • 来源过滤fontSource):0只显示内置字体,1只显示系统字体;
  • 渲染模式过滤rasterization):当渲染模式为"Modern"(值 4)时只显示高分辨率字体,其余模式只显示低清像素字体(系统字体不受此限制)。

🔍 还有一个贴心的细节:过滤后如果当前选中的字体不在新列表里,会自动回退到列表第一项并发出fontNameChanged信号,保证界面永不悬空。

管理字体:属性写入与变更信号

FontManager的全部可写属性都会触发"过滤 + 重算"流水线(以 setFontSource 为例):

属性作用范围/示例
fontSource切换内置 / 系统字体0 / 1
rasterization渲染模式Default、Scanlines、Pixels、Sub-Pixels、Modern
fontName指定字体内部名TERMINESS_SCALEDHACK
fontScaling字号缩放(滑块 0.75 起)baseFontScaling相乘生效
fontWidth/lineSpacing字宽与行距0.5–1.5 / 0.0–1.0

字体参数最终经由terminalFontChanged信号下发给终端渲染层(updateComputedFont),PreprocessedTerminal.qml 连接该信号并调用refresh()完成应用。

内置字体速查表

内部名显示名类型
TERMINESS_SCALEDTerminess低清(默认)
UNSCII_8_SCALED/UNSCII_16_SCALEDUnscii 8 / 16低清
COMMODORE_64_SCALEDCommodore 64低清
IBM_VGA_8x16IBM VGA 8x16低清
HACK/FIRA_CODE/IOSEVKAHack / Fira Code / Iosevka现代高分辨率
JETBRAINS_MONOJetBrains Mono现代高分辨率
OPENDYSLEXICOpenDyslexic现代(阅读障碍友好)

完整 20 余条注册见 populateBundledFonts,字体文件位于 app/qml/fonts/。

QML 实战:字体下拉框是怎么接上的

设置面板的"Terminal"页签是字体列表 API 的完整示范(SettingsTerminalTab.qml):

  1. ComboBoxmodel绑定appSettings.filteredFontListtextRole"text"
  2. 用户选中时调用get(currentIndex),并根据lowResolutionFont自动切换渲染模式——选高分字体自动进 Modern 模式,选低清字体自动回到 Default;
  3. 通过Connections监听onTerminalFontChangedonFilteredFontListChanged,在字体列表变动时调用updateIndex()同步下拉框选中项。

FontManager在 ApplicationSettings.qml 中创建,并将filteredFontList等属性 alias 给全局appSettings,因此任何 QML 文件都能访问。

总结

  • 拿全量字体用fontManager.fontList,拿界面可见列表用fontManager.filteredFontList
  • 按索引取详情用get(index),返回包含 9 个字段的字典;
  • 改字体只需写fontName/fontSource/rasterization属性,过滤与渲染参数重算全自动完成;
  • 扩展新字体时,在 fontmanager.cpp 中调用addBundledFont()注册一条FontEntry即可,无需改动其他代码。

掌握这套 API,你就能轻松为 cool-retro-term 定制任何想要的复古字体体验 🖥️

【免费下载链接】cool-retro-termA good looking terminal emulator which mimics the old cathode display...项目地址: https://gitcode.com/GitHub_Trending/co/cool-retro-term

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 14:29:19

Java课设宠物领养系统实战:Swing+JDBC+MySQL从建表到答辩

简介:这是一份基于Java Swing与MySQL实现的宠物领养系统完整课设源码包,适合Java课程设计、毕业设计入门及需要快速落地项目的开发者参考。系统包含完整的业务代码、界面素材与数据库脚本,覆盖宠物信息管理、领养记录等核心模块,能…

作者头像 李华
网站建设 2026/9/16 14:28:01

2025年AI写作工具市场分析与十大推荐

1. 2025届AI写作工具市场现状2025年的内容创作领域已经全面进入人机协同时代。根据最新行业调研数据显示,超过87%的专业内容创作者在日常工作中至少使用一种AI写作辅助工具,而这一比例在三年前还不足35%。市场需求的激增催生了大量新兴工具,同…

作者头像 李华
网站建设 2026/9/16 14:27:03

CodeBuddy 跑 WireMCP 分析 PCAP:Key 用 TaoToken

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

作者头像 李华
网站建设 2026/9/16 14:26:39

JDK25安装指南:从下载到环境配置全解析

1. JDK25概述与环境准备Java Development Kit 25(JDK25)是Oracle公司推出的最新Java开发工具包,包含运行、调试和监控Java应用程序所需的完整工具链。与之前版本相比,JDK25在性能优化、安全增强和语言特性方面都有显著改进。对于开…

作者头像 李华