
桌面应用跨平台【免费下载链接】nodeguiA library for building cross-platform native desktop applications with Node.js and CSS . React NodeGui : https://react.nodegui.org and Vue NodeGui: https://vue.nodegui.org项目地址https://gitcode.com/gh_mirrors/no/nodegui点击查看免费下载本文围绕 NodeGui 生成的 API 参考页 QIconState 展开系统讲解该枚举在图标体系中的定位、Off/On两个成员的语义、它在QIcon各方法中的参数默认值以及从 TypeScript 层到 C N-API 绑定的完整透传链路。读完后你将掌握如何基于QIconState为同一图标准备选中/未选中两套像素资源并理解 state 参数在整个调用链上是如何被逐层解析的。QIconState 的定义与成员QIconState是 NodeGui 对 QtQIcon::State内嵌枚举的 JavaScript 镜像定义在 QIcon.tsexport enum QIconState { Off, On, }两个成员含义对应 Qt 的QIcon::State成员数值语义Off0图标的关状态即默认、未激活、未选中形态On1图标的开状态即激活、选中、勾选形态Off与On的设计目标是让一个QIcon能够同时携带多套像素例如复选框/切换类控件的图标未勾选时用Off版本勾选后切换到On版本。该枚举通过 src/index.ts 从包入口统一导出使用时可直接require(nodegui/nodegui)后取用const { QIcon, QIconState } require(nodegui/nodegui);state 参数QIcon 上所有接受它的 APIQIconState本身只是一个两值枚举它的价值体现在QIcon类的多个方法签名中。对照 NodeGui 自动生成的类参考 QIcon 与源码 QIcon.ts共有 6 个方法接收state参数且默认值统一为QIconState.Off方法签名节选自源码state 默认值actualSizeactualSize(size: QSize null, mode QIconMode.Normal, state QIconState.Off): QSizeOffaddFileaddFile(fileName: string, size: QSize null, mode QIconMode.Normal, state QIconState.Off): voidOffaddPixmapaddPixmap(pixmap: QPixmap, mode QIconMode.Normal, state QIconState.Off): voidOffavailableSizesavailableSizes(mode QIconMode.Normal, state QIconState.Off): QSize[]Offpaintpaint(painter, x, y, w, h, alignment?, mode?, state?)Offpixmappixmap(width, height, mode QIconMode.Normal, state QIconState.Off): QPixmapOff值得注意的是pixmap的 JS 封装采用了宽参策略它接收width、height两个数字而不是QSize对象与 Qt 原生QPixmap pixmap(const QSize size, ...)的签名略有差异。这一适配在 C 侧也有对应处理见下文。构造一个带 On/Off 双状态的图标结合上面的 API一个典型的勾选状态图标构建流程如下基于源码中真实存在的方法组合可复制运行const { QIcon, QIconState, QIconMode, QPixmap, QSize, QApplication } require(nodegui/nodegui); const app new QApplication([]); // 需要 QApplication 支撑位图资源 // 同一个 QIcon 上挂两套像素未选中(Off) 与 选中(On) const icon new QIcon(); icon.addPixmap(new QPixmap(unchecked.png), QIconMode.Normal, QIconState.Off); icon.addPixmap(new QPixmap(checked.png), QIconMode.Normal, QIconState.On); // 查询某个状态下有哪些可用尺寸 const offSizes icon.availableSizes(QIconMode.Normal, QIconState.Off); const onSizes icon.availableSizes(QIconMode.Normal, QIconState.On); offSizes.forEach((s: QSize) console.log(Off size:, s.width, s.height)); // 按状态取位图不传 state 时默认取 Off 状态 const offPixmap icon.pixmap(64, 64, QIconMode.Normal, QIconState.Off); const onPixmap icon.pixmap(64, 64, QIconMode.Normal, QIconState.On); // 查询在给定目标尺寸下图标实际会被缩放到多大 const fitted icon.actualSize(new QSize(64, 64), QIconMode.Normal, QIconState.On); console.log(fitted size:, fitted.width, fitted.height);addFile与addPixmap是等价的资源注入方式前者直接从文件路径加载内部在 C 侧用QString::fromUtf8转码后调用QIcon::addFile后者接收已构造的QPixmap对象。若图标被设置为 mask 图标setIsMask(true)state 的选取会进一步参与 Qt 对蒙版图标的渲染路径这一点可从 qicon_wrap.cpp 中setIsMask的绑定得到印证。C 绑定层state 的透传与默认值处理NodeGui 的架构是JS 包装类 N-API 绑定 原生 Qt 对象三层结构。QIconState的数值在 qicon_wrap.cpp 中被static_castQIcon::State还原为 Qt 枚举例如actualSize的绑定L67-L80QIcon::State state static_castQIcon::State(info[2].AsNapi::Number().Int32Value()); QSize result this-instance-actualSize(*size, mode, state);addFileL82-L95、addPixmapL97-L108、availableSizesL110-L123、paintL163-L180均遵循同样的模式把 JS 数字参数按位宽转为Int32再强转为QIcon::State传给原生QIcon实例。有一个实现细节值得注意pixmap的 C 绑定对 mode/state 做了缺省即默认的兜底L132-L142QIcon::State state QIcon::Off; if (info.Length() 3) { int stateInt info[3].AsNapi::Number().Int32Value(); state static_castQIcon::State(stateInt); }也就是说即使绕过 JS 层默认参数直接调用底层方法state 缺失时也会落回QIcon::Off与文档声明的默认值QIconState.Off保持一致。这解释了为什么在 QIcon 的每个方法参数表中state一列的 Default 都是QIconState.Off。与 QIconMode 的协作关系state永远与mode成对出现。QIconMode定义于 QIcon.ts取值为Normal、Disabled、Active、Selected对应 Qt 的QIcon::Mode其参考页见 QIconMode。两者的正交组合意味着一个图标最多可以携带 4 种模式 × 2 种状态共 8 套像素。在 NodeGui 中图标通常经由控件 API 消费例如 QAbstractButton.setIcon 和 QAction.setIcon 只负责传入QIcon对象随后由 Qt 根据控件自身的选中/悬停等状态自动挑选合适的 mode/state 版本来绘制——这正是把On/Off两套资源注册进同一个QIcon的实际意义所在。测试用例中的验证仓库现有的 Jest 测试 QIcon.test.ts 覆盖了QIcon的构造与cacheKey行为it(initialize with string, () { const icon new QIcon(testImagePath); expect(icon).toBeTruthy(); }); it(returns the cache Key, () { const icon new QIcon(testImagePath); const cacheKey icon.cacheKey(); expect(Number.isInteger(cacheKey)).toBe(true); });当前测试未直接对QIconState.On的像素选取做断言这属于该测试集的覆盖边界若需要自证 state 生效可参照上文构造一个带 On/Off 双状态的图标一节比较两种状态下pixmap()返回结果或actualSize()的结果差异。小结与参考路径QIconState虽然只有Off、On两个成员但它是 NodeGui 图标 API 中双状态图标能力的开关位所有QIcon方法中 state 参数默认Off与QIconMode正交组合并在 C 绑定层被逐位还原为 Qt 的QIcon::State。核心参考路径汇总枚举定义src/lib/QtGui/QIcon.ts方法签名与默认值src/lib/QtGui/QIcon.tsC 绑定实现src/cpp/lib/QtGui/QIcon/qicon_wrap.cpp绑定声明src/cpp/include/nodegui/QtGui/QIcon/qicon_wrap.h类级 API 参考website/docs/api/generated/classes/qicon.md测试用例src/lib/QtGui/tests/QIcon.test.ts赞分享桌面应用跨平台【免费下载链接】nodeguiA library for building cross-platform native desktop applications with Node.js and CSS . React NodeGui : https://react.nodegui.org and Vue NodeGui: https://vue.nodegui.org项目地址https://gitcode.com/gh_mirrors/no/nodegui点击查看免费下载相关推荐Oralyzer与其他安全工具对比为什么它是Open Redirection检测的首选Oralyzer与其他安全工具对比为什么它是Open Redirection检测的首选 Open Redirection开放重定向漏洞是Web应用中常见NodeGui 中的 MovieState 枚举理解 QMovie 动图播放状态的完整指南NodeGui 中的 MovieState 枚举理解 QMovie 动图播放状态的完整指南 导读 MovieState 是 NodeGui 中用于描述 QMo桌面应用跨平台NodeGui 中 QAbstractItemViewSelectionBehavior 枚举详解控制 Item 视图的行、列与项选择行为NodeGui 中 QAbstractItemViewSelectionBehavior 枚举详解控制 Item 视图的行、列与项选择行为 本文围绕 Node桌面应用跨平台上一篇如何用 Atmosphere DNS.mitm 重定向并屏蔽指定服务器下一篇探索OSharp一站式.NET开发框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考