Skip to content

feature: more widgets support#14

Merged
Charliechen114514 merged 8 commits into
mainfrom
instance/widget-painter-batch
Jun 25, 2026
Merged

feature: more widgets support#14
Charliechen114514 merged 8 commits into
mainfrom
instance/widget-painter-batch

Conversation

@Charliechen114514

Copy link
Copy Markdown
Member

No description provided.

circle-progress / speed-meter / range-slider / line-chart 四件自绘控件,
复用 status-led/toggle-switch 骨架(AwesomeQt:: 命名空间 + Q_PROPERTY + 动画
+ paintEvent + sizeHint/minimumSizeHint),各占一种 QPainter 技术:
drawArc 弧+中心文字 / 弧+指针旋转+刻度 / 双柄拖拽+区间高亮 / polyline+坐标轴 auto-scale。

每件含 STATIC 库 + 独立 demo + 成品导览 + 手搓手册(5 文件),从 widget/ 全量
cmake 构建零 warning,4 个 demo offscreen 冒烟通。widget/CMakeLists.txt 接入
4 个 add_subdirectory,widget 栏进度 2/13 → 6/13。
刻度/指针原用「cos/sin + 屏幕 y 朝下」算位置,与 drawArc 的「0°=3 点、逆时针」
(y 朝上)约定差一个 y 翻转;指针又多转 +90°「修正」,叠加后刻度/指针被上下镜像,
导致 value=0 的指针怼到 value=220 那一端。

统一到「屏幕角 β」(3 点为 0°、顺时针为正,与 rotate/cos·sin 一致):
β(v)=135°+(v/max)×270° → v=0 左下、mid 顶部、v=max 右下,开口朝下。指针
rotate(β) 直接转不修正;只有 drawArc 单独用 Qt 约定(225*16、-270*16)。

离屏渲染 v=0/v=110/v=220 验证指针方向正确;全量构建零 warning、demo offscreen
冒烟通。同步重写 speed-meter 文档(index 决策②③④+踩坑①②+怎么读、handbook/02
整篇、handbook/01 角度节、troubleshooting 指针节)并修正全部漂移的 file:行号。
editable-table:封装 QTableWidget,按列声明类型(kText/kInt/kDouble/kCombo/kCheck),
detail::ValidatorDelegate 用 std::function 回调拿列规格(无引用环),编辑时挑编辑器
+ 范围/空值校验;setData/data 整表往返,suppress_signal_ 防程序化回灌。

checkbox-tree:封装 QTreeWidget,三态勾选 + 父子联动(propagateDown/recalcUp/
aggregateState),is_propagating_ + blockSignals 双闸防 itemChanged 雪崩。

两件各 STATIC 库 + 独立 demo + 成品导览 + 手搓手册(5 文件),全量构建零 warning、
offscreen 冒烟通、markdownlint 过。widget/CMakeLists.txt 接入 2 个 add_subdirectory,
widget 栏 6/13 → 8/13。
控件被布局压小时,11 个数字标签会互相挤成一团。加几何阈值:相邻主刻度标签的
弧距 < 标签宽 + 留白(4px) 时整组标签藏掉,弧/刻度/指针/底部读数仍保留。阈值按
真实字体宽度算(fm.horizontalAdvance(量程上限)),恰好在开始挤压那一刻触发,非
任意像素常数。确定性诊断:100/140px 藏、175px 起显、默认 200px 显。

同步 speed-meter 文档(index 它做什么+决策④+怎么读+踩坑②、handbook/01 对照、
handbook/02 对照、troubleshooting 指针节)的 file:行号(本次代码 +12 行漂移)。
- kDouble 的 QDoubleSpinBox 没设 setSingleStep,默认步长 1.0:在 [0,1] 这种小量程
  上上下键一次 0→1 直接到顶、根本调不到小数。改为按量程自适应(下限 0.1),
  typing 仍可输任意 3 位小数。
- 表格没填满 viewport:列按 resizeColumnsToContents 只占内容宽、右侧留大片空白。
  horizontalHeader()->setStretchLastSection(true) 让最后一列拉伸填宽。
…r + password-edit

checkbox-list:封装 QListWidget 扁平勾选,checkAll/uncheckAll/invertChecked +
checkedTexts/checkedItems 汇总;批量操作 blockSignals 守卫防 itemChanged 雪崩
(checkbox-tree 的列表版,无父子联动)。

log-viewer:封装 QPlainTextEdit 只读日志,Level(Info/Warning/Error) + QTextCharFormat
级别染色(Info 用默认色,主题自适应)+ autoScroll 滚底 + trimOldBlocks 按 blockCount
裁旧(maxLines 上限防内存膨胀)。

password-edit:QLineEdit 密码(EchoMode) + QToolButton 显隐 + 实时强度(computeStrength
按长度+字符种类,static 可独立测试;3 色块 QSS 染色不自绘)。

三件各 STATIC 库 + 独立 demo + 成品导览 + 手搓手册(5 文件),全量构建零 warning、
offscreen 冒烟通、markdownlint 过。本批起 code Agent 预 clang-format -i,行号不漂、
提交一把过。widget 栏 8/13 → 11/13。
ip-edit:IPv4 输入,4 个 QLineEdit 八位段 + 点分隔。keyPressEvent 管焦点流转
(. 跳下段、段首退格跳上段、满 3 位自动跳);QIntValidator(0,255) + setText
拆填 clamp;text() 空段补 0、isValid() 全 0 判未填。

fade-animation:FadeWidget 容器,QGraphicsOpacityEffect + 持久 QPropertyAnimation
驱动 opacity。fadeIn 先 setOpacity(0) 再 show 防"先蹦再淡",fadeOut 完 hide;
opacity 的 WRITE 纯赋值(外部可绕动画瞬时设值,真 Q_PROPERTY 语义)。

两件各 STATIC 库 + 独立 demo + 成品导览 + 手搓手册(5 文件),全量构建零 warning、
offscreen 冒烟通、markdownlint 过、预 clang-format 一把过。widget 栏 13/13 全部完成。
- 3 个 index.md(speed-meter/fade-animation/ip-edit)教程链接深度错:用了 5 级
  ../../../../../ 跑到仓库根,改回 4 级 ../../../../(index.md 在 widget/<name>/
  是 5 层深,到 tutorial/ 该 4 级 ../)
- line-chart 两处文件名编造:04-font-text-beginner → 04-font-text-rendering-beginner
- speed-meter handbook:09-advanced → 09-animation-advanced
- password-edit handbook 同件引用深度:../status-led/ → ../../status-led/

本地 scripts/document/check_links.py --internal-only 验证 429 OK / 0 broken。
@Charliechen114514 Charliechen114514 merged commit fcde408 into main Jun 25, 2026
4 checks passed
@Charliechen114514 Charliechen114514 deleted the instance/widget-painter-batch branch June 25, 2026 12:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant