首页/新闻资讯/正文详情

NodeGui 中 FillRule 枚举详解:OddEvenFill 与 WindingFill 填充规则的实战应用

发布时间:2026/9/25 3:44:37 来源:云帆数科 栏目:资讯中心
NodeGui 中 FillRule 枚举详解:OddEvenFill 与 WindingFill 填充规则的实战应用
桌面应用跨平台【免费下载链接】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基于 Qt 与 Node.js 的跨平台原生桌面应用框架中FillRule枚举的完整语义与用法。FillRule对应 Qt 中Qt::FillRule枚举用于决定 QPainterPath 这类自相交或嵌套路径的哪些区域应被填充是进行复杂图形绘制的关键开关。读完本文你将掌握两个枚举值的数学判定原理、在 QPainterPath 上的读写方法以及通过 QPainter.drawPath 绘制复杂形状的完整调用链。FillRule 枚举的定义与位置在 NodeGui 中FillRule定义于 TypeScript 侧的 QtEnums 模块源文件为 src/lib/QtEnums/FillRule/index.tsexport enum FillRule { OddEvenFill 0, WindingFill 1, }它由 src/lib/QtEnums/index.ts 统一导出export { FillRule } from ./FillRule;FillRule是对 Qt 原生枚举Qt::FillRule的一一映射封装包含两个成员枚举成员数值Qt 对应枚举填充判定规则FillRule.OddEvenFill0Qt::OddEvenFill奇偶规则Odd-Even RuleFillRule.WindingFill1Qt::WindingFill非零环绕规则Non-Zero Winding Rule在自动生成的 API 文档 website/docs/api/generated/enums/fillrule.md 中同样只记录了这两个枚举成员且数值分别为0与1与 TypeScript 源码完全一致。由于 TypeScript 枚举默认按声明顺序从 0 自增这两个数值也可视为隐式约定的稳定标识——它们会被直接透传到原生层。两种填充规则的数学原理FillRule解决的核心问题是当一条路径存在自相交或包含嵌套子路径时哪些区域属于内部应被填充。两种规则基于不同的判定算法OddEvenFill奇偶规则数值 0从待判定点向任意方向引一条射线统计它与路径线段子路径边界的交点个数交点个数为奇数→ 该点在路径内部被填充交点个数为偶数→ 该点在路径外部不填充。这条规则的显著特征是不关心路径的绘制方向顺时针或逆时针。对于五角星这类自相交图形采用 OddEvenFill 时中央的五边形区域因射线会穿越偶数条线段而保持镂空绘制结果是一个带空心中心的五角星轮廓。重叠区域遵循异或式的交替逻辑。WindingFill非零环绕规则数值 1同样从待判定点引射线但会统计路径与射线的方向环绕方向每穿过一条线段根据线段相对射线的走向将环绕数winding number加 1 或减 1若最终环绕数非零→ 该点位于路径内部被填充若最终环绕数为零→ 该点位于路径外部不填充。这条规则的显著特征是依赖子路径的绘制方向。仍以五角星为例若外轮廓与内部凹入部分按同一方向绘制WindingFill 会把整颗星包括中央五边形全部填充为实心若内圈反向绘制则中央区域会被挖空。实践中WindingFill常用于绘制环形、回字形等需要依靠方向区分内外边界的形状。一句话对比OddEvenFill 只看穿越次数的奇偶WindingFill 还额外统计穿越方向的净环绕数。在 QPainterPath 中的读写接口FillRule在 NodeGui 中的主要消费方是QPainterPath封装文件为 src/lib/QtWidgets/QPainterPath.ts其中提供了两个相关方法fillRule(): FillRule { return this.native.fillRule(); } setFillRule(fillRule: FillRule): void { return this.native.setFillRule(fillRule); }path.fillRule()返回当前路径的填充规则FillRule.OddEvenFill或FillRule.WindingFill。新建的QPainterPath默认采用Qt::OddEvenFillpath.setFillRule(fillRule)设置路径的填充规则在向路径添加子路径之前调用效果最佳。原生调用链验证从源码结构看这两个方法最终通过 N-API 落到 Qt 原生对象上完整的调用链是TypeScript 侧调用this.native.fillRule()/this.native.setFillRule(fillRule)见 QPainterPath.ts原生封装类QPainterPathWrap在 qpainterpath_wrap.cpp 与 qpainterpath_wrap.cpp 中实现桥接Napi::Value QPainterPathWrap::fillRule(const Napi::CallbackInfo info) { Napi::Env env info.Env(); int v static_castint(this-instance-fillRule()); return Napi::Number::From(env, v); } Napi::Value QPainterPathWrap::setFillRule(const Napi::CallbackInfo info) { Napi::Env env info.Env(); int v info[0].AsNapi::Number().Int32Value(); this-instance-setFillRule(static_castQt::FillRule(v)); return env.Null(); }可以看到枚举值在边界处以int形式传递并在原生侧强转回Qt::FillRule这正是OddEvenFill 0、WindingFill 1这两个数值约定被定义在 TypeScript 枚举中的根本原因。对应的原生方法声明位于 qpainterpath_wrap.h。绘制时的完整消费链QPainter.drawPath设置好填充规则的QPainterPath最终要交给QPainter绘制。NodeGui 的QPainter在 src/lib/QtWidgets/QPainter.ts 中暴露了drawPathdrawPath(path: QPainterPath): void { return this.native.drawPath(path.native); }因此一条完整的绘制链路是创建QPainterPath实例用moveTo、lineTo、cubicTo、quadTo、closeSubpath等构建子路径调用setFillRule(FillRule.WindingFill | FillRule.OddEvenFill)选择填充规则在 QPainter例如窗口或控件的paintEvent中获取上调用drawPath(path)完成绘制。值得说明的是QPainter.ts 中还留有drawPolygon(..., Qt::FillRule fillRule Qt::OddEvenFill)的 TODO 注释表明 Qt 的drawPolygon本身也接受填充规则参数但当前 NodeGui 封装尚未实现该方法——因此现阶段在 NodeGui 中操作填充规则统一走QPainterPath.setFillRule这一途径。实战示例用两种规则绘制五角星结合QPainterPath已有的公开 APImoveTo、lineTo、closeSubpath、setFillRule与QPainter.drawPath可以编写一个展示两种填充规则差异的最小示例。五角星属于典型的自相交路径外轮廓的五个顶点与内凹的五个顶点交替连线后中央会形成一个闭合小五边形。import { QPainterPath } from nodegui/nodegui; import { FillRule } from nodegui/nodegui; function createStarPath(cx: number, cy: number, outerRadius: number, innerRadius: number): QPainterPath { const path new QPainterPath(); path.moveTo(cx, cy - outerRadius); for (let i 1; i 5; i) { const outerAngle -Math.PI / 2 (i * 2 * Math.PI) / 5; const innerAngle -Math.PI / 2 ((i - 0.5) * 2 * Math.PI) / 5; path.lineTo(cx outerRadius * Math.cos(outerAngle), cy outerRadius * Math.sin(outerAngle)); path.lineTo(cx innerRadius * Math.cos(innerAngle), cy innerRadius * Math.sin(innerAngle)); } path.closeSubpath(); return path; } // 奇偶规则中央小五边形镂空 const hollowStar createStarPath(60, 60, 50, 20); hollowStar.setFillRule(FillRule.OddEvenFill); // 非零环绕规则整颗星实心填充各线段按同一方向绘制 const solidStar createStarPath(180, 60, 50, 20); solidStar.setFillRule(FillRule.WindingFill);将这两个 path 分别经painter.drawPath(hollowStar)与painter.drawPath(solidStar)绘制到画布即可直观看到同一几何路径在两种规则下的填充差异左侧星中央镂空右侧星整体实心。选择建议与注意事项默认值新建的QPainterPath默认使用OddEvenFill。若你的形状不含自相交或方向性嵌套两种规则的结果一致无需显式设置何时用 OddEvenFill绘制五角星、爆炸符号等自相交图形时希望重叠区域交替镂空或子路径方向不可控如从外部数据导入的路径时用它可获得与方向无关的稳定结果何时用 WindingFill绘制环形、回字形等需要靠方向区分内外的形状或希望重叠区域取并集而非镂空时注意它依赖子路径的绘制方向顺时针/逆时针构建路径时需保持一致设置时机setFillRule应在路径构建完成或构建相关子路径之前调用对同一QPainterPath反复切换规则是允许的绘制时会按当前规则生效。小结FillRule虽只是两个数值的简单枚举却是理解 NodeGui 复杂图形绘制的一把钥匙OddEvenFill 0与WindingFill 1分别对应 Qt 的奇偶规则与非零环绕规则二者通过QPainterPath.setFillRule/fillRule读写最终由QPainter.drawPath消费。相关实现可分别在 QPainterPath.ts、qpainterpath_wrap.cpp 与 QPainter.ts 中继续查阅QPainterPath的完整 API 清单见 website/docs/api/generated/classes/qpainterpath.md。赞分享桌面应用跨平台【免费下载链接】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 BrushStyle 枚举完全指南QBrush 填充样式与数值对照NodeGui BrushStyle 枚举完全指南QBrush 填充样式与数值对照 本指南以 NodeGui 官方 API 文档中的 BrushStyle 枚桌面应用跨平台NodeGui 中的 ApplicationAttribute 枚举详解从 Qt 应用级属性到 Node.js 桌面应用实践NodeGui 中的 ApplicationAttribute 枚举详解从 Qt 应用级属性到 Node.js 桌面应用实践 导读 ApplicationAt桌面应用跨平台NodeGui 中 SequenceMatch 枚举详解QKeySequence 按键序列匹配的原理与实战NodeGui 中 SequenceMatch 枚举详解QKeySequence 按键序列匹配的原理与实战 SequenceMatch 是 Node.js 跨桌面应用跨平台上一篇Immich 数据库迁移实战schema 变更、ORDER 清单与迁移回滚的完整闭环下一篇ASP.NET Core微服务架构基于框架构建分布式系统的最佳实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

rkt 原生支持 OCI 镜像格式的路线图:从 ACI 到多格式镜像分发架构的演进
rkt 原生支持 OCI 镜像格式的路线图:从 ACI 到多格式镜像分发架构的演进

容器运行时云原生网络 【免费下载链接】rkt [Project ended] rkt is a pod-native container engine for Linux. It is composable, secure, and built on standards. 项目地址: https://gitcode.com/gh_mirrors/rk/rkt 点击查看 免费下载 rkt 的镜像处理历来以 ap… · 2026/9/25 3:44:37

F´ GDS History 机制深度解析:ChronologicalHistory、TestHistory 与 RamHistory 的设计与实战
F´ GDS History 机制深度解析:ChronologicalHistory、TestHistory 与 RamHistory 的设计与实战

嵌入式系统编程 【免费下载链接】fprime F - A flight software and embedded systems framework 项目地址: https://gitcode.com/gh_mirrors/fpri/fprime 点击查看 免费下载 本文围绕 F(F Prime)飞行软件框架 GDS(地面数据系统&… · 2026/9/25 3:44:31

大模型应用落地全指南:从选型到微调部署实践
大模型应用落地全指南:从选型到微调部署实践

这两年谁要是还敢说自己没听过“大模型”三个字,大概是真的脱离科技圈了。从GPT刷屏到国内Qwen、DeepSeek接连开源,再到身边越来越多把大模型接进业务系统的案例,这个领域的更新速度已经快到“追都追不动”的程度。我做AI应用开发这些年&… · 2026/9/25 3:44:31

wp-calypso 中的 Quick Start(Business Concierge)预约流程:路由设计、多步向导组件与数据层实现
wp-calypso 中的 Quick Start(Business Concierge)预约流程:路由设计、多步向导组件与数据层实现

前端CMS 【免费下载链接】wp-calypso The JavaScript and API powered WordPress.com 项目地址: https://gitcode.com/gh_mirrors/wp/wp-calypso 点击查看 免费下载 本篇技术文章以 client/me/concierge/README.md 为骨架,结合 wp-calypso(T… · 2026/9/25 5:36:21

hunkdiff 内容搜索的空白保留:从 less 式 `/` 查询到 n/N 重复的完整实现剖析
hunkdiff 内容搜索的空白保留:从 less 式 `/` 查询到 n/N 重复的完整实现剖析

开发工具代码评审CLIAI 应用 【免费下载链接】hunk Review-first terminal diff viewer for agentic coders 项目地址: https://gitcode.com/gh_mirrors/hu/hunk 点击查看 免费下载 hunk 是面向 agent 化开发者的 review-first 终端 diff 查看器,其内置… · 2026/9/25 5:36:21

阅读笔记:《云计算关键领域安全指南v5》
阅读笔记:《云计算关键领域安全指南v5》

云计算是一种运营模型和一组技术,用于通过对计算、网络、存储等资源的抽象来管理共享资源池。云计算能够实现通过网络访问可扩展且具有弹性的可共享的物理或虚拟资源池,并可按需进行自助式资源调配和管理。云可以由几乎任何计算资源组成,从处… · 2026/9/25 5:36:09

OpenShell Release Canary 实战指南:发布工件的最后一道冒烟关卡
OpenShell Release Canary 实战指南:发布工件的最后一道冒烟关卡

【免费下载链接】OpenShell OpenShell is the safe, private runtime for autonomous AI agents. 项目地址: https://gitcode.com/gh_mirrors/op/OpenShell 点击查看 免费下载 OpenShell 的 Release Canary(工作流定义位于 .github/workflows/release-c… · 2026/9/25 5:36:09

Agent技能管理实战:从Prompt堆砌到结构化技能编排
Agent技能管理实战:从Prompt堆砌到结构化技能编排

做Agent开发也有小半年了,我最大的感受是:大多数人不是被模型能力卡住的,而是被“技能管理”卡住的。你让Agent做的事越多,它的行为就越不可控,Prompt越堆越长,到最后修一个bug能扯出一串连锁问题。这个项目… · 2026/9/25 5:36:09

ESPnet 2 端到端语音识别实战:基于 OpenSLR 35 爪哇语(Javanese)语料库的 Transformer ASR 配方与 WER/CER/TER 结果深度解析
ESPnet 2 端到端语音识别实战:基于 OpenSLR 35 爪哇语(Javanese)语料库的 Transformer ASR 配方与 WER/CER/TER 结果深度解析

人工智能语音音频深度学习NLP 【免费下载链接】espnet End-to-End Speech Processing Toolkit 项目地址: https://gitcode.com/gh_mirrors/es/espnet 点击查看 免费下载 本篇技术指南以 ESPnet 仓库中 egs2/jv_openslr35/asr1/README.md 的实验结果记录为核心&… · 2026/9/25 5:36:03

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

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

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

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

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码