Files
scuc-qt-course/docs/ERRATA_part3.md
T
张宗平 13b3ebbe14 课程代码仓库初始化:Part1 (144) + Part3 (29) 全量生成与验证
把川大 wiki「02.Qt方向」课程代码整理为 CMake 管理的可编译运行项目。

Part1 C/C++ 强化 (p01/, 144 目标, host gcc/g++ 构建, 全绿):
- 修复全部编译失败:补 <cstring>/<fstream>/<iomanip>/<vector> 等缺失头
  (common_fix + infer_stl_includes 自动检测注入)、修正 pause() 壳注入
  (改检测已转换后的 pause 调用)、namespace 提升出函数体、const 成员函数
  正确性、dedupe 不再破坏函数重载集、K&R 隐式 int / 动态异常规范等
  C++17 移除特性的可编译等价改写。
- 目录采用深缩写 p01/ch04/s03/ (原 part1_cpp/ch04_class_object/03_ctor_dtor)。

Part3 Qt 桌面 (p03/, 29 目标, 隔离 Qt 5.14.2 构建, 全绿):
- gen_part3.py: Qt 外壳模板 (main+QApplication+show, QTimer 自动退出便于
  offscreen 验证)、AUTOMOC + .moc include、rewrite_* 处理散文混入/重载/
  资源依赖、生成占位 png/gif + .qrc + rundata 样例数据。
- 修正 QLable 笔误、全角分号、.→->、Windows 路径、QApplication 阻塞事件
  循环改为 QCoreApplication 等。

任务1 概念/版本验证:
- tools/std_probe.py: 跨 -std= 编译探针 (--pedantic-errors 让已废除特性硬失败)。
- tools/demo_versions/: K&R 隐式 int、三目左值、void* 转换、enum 赋整、
  const 经指针、动态异常规范 共 6 个跨版本演示。
- docs/VERSION_NOTES.md: 每条「原文说法→C17/C++17 是否成立→何版本成立→已验证」。

文档: 顶层 README、docs/SOURCE_PAGES.md (页面→目录映射)、
docs/ERRATA.md (Part1 修正)、docs/ERRATA_part3.md (Part3 修正)。
另修复 tools/run.sh / run_qt.sh 的 ${1:?...} 引号语法 bug。

隔离 Qt 验证: ldd 0 系统 Qt 引用; 173/173 目标全绿; p03 offscreen 运行通过。
2026-06-30 14:16:55 +08:00

126 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ERRATA — 代码修正记录(Part3 Qt
本文件由 `tools/gen_part3.py` 自动生成,记录对 wiki 原始 Qt 代码块的每一处修正。
格式:`[pageId:blockIdx]` 类型 → 原内容 → 修正后 → 依据。
## [58954515:0] missing-symbol
- **原文**`原文 #include "widget.h" 引用外部 Widget 类(widget.h/widget.cpp 不在块内)`
- **修正**`在文件内就地补一个最小 Widget : public QWidgetQ_OBJECT+ main`
- **依据**:原 wiki 的「最简单 Qt 程序」依赖外部的 widget.h;按「示例相对隔离」拆分为独立目标后本文件缺少 Widget 定义。补最小 Widget 使其自洽可编译运行。
## [58954525:0] prose-in-code
- **原文**`按钮创建片段行内混入散文「头文件 #include <QPushButton>」,且含中文字符串`
- **修正**`重写为可编译 DemoWidget(剥离散文、保留中文文本)`
- **依据**:原 wiki 把讲解散文粘在代码行内(如 #include 当成尾巴),破坏语法;通用 prose 剥离会误伤字符串内的中文,故整体重写保留教学意图。
## [58954527:0] harness-context
- **原文**`片段 connect(quitBtn,&QPushButton::clicked,this,&MyWidget::close) 引用 MyWidget,但 MyWidget 定义不在块内`
- **修正**`补 DemoWidget 子类 + main 外壳,槽用 QWidget::close(系统自带)`
- **依据**:原 wiki 片段假定存在 MyWidget 类与 close 槽;按「示例相对隔离」补齐类骨架与 main,演示「系统自带信号(clicked)→系统自带槽(close)」。
## [58954527:2] prose-in-code
- **原文**`自定义信号槽:Teacher/Student/MyWidget 定义与中文散文混排,且信号名 hungury 笔误、槽名 treat/eat 不一致`
- **修正**`重写为可编译对照程序:信号 hungry()/hungry(QString)、槽 treat()/treat(QString),函数指针重载解析 connect`
- **依据**:原 wiki 把类定义、emit、connect 与中文讲解散文混在一个代码块,无法编译;信号名 hungury 疑为 hungry 笔误。重写保留「自定义信号+槽+重载」教学意图。
## [58954529:4] prose-in-code
- **原文**`QDockWidget 片段尾部混入散文「设置区域范围」,含中文标题字符串`
- **修正**`重写为可编译 DemoMainWindow(剥离散文、保留中文标题)`
- **依据**:原 wiki 把讲解散文粘在代码行尾(setAllowedAreas 后接「设置区域范围」),破坏语法;整体重写保留「铆接部件」教学意图。
## [58954535:12] merge+rewrite
- **原文**`文件对话框示例分散在 12/13/14 三块(含 :/images/file-open 资源、connect、openFile/saveFile 实现)`
- **修正**`合并重写为单一可运行 MainWindow 程序,菜单/工具栏触发文件对话框读写`
- **依据**:原文三块是同一 MainWindow 的不同部分(构造、连接、槽实现),独立成文件无法编译;合并为完整目标。原文引用资源图标,本目标用纯文字 Action 避免资源依赖。
## [58954540:1] typo
- **原文**`QLable`
- **修正**`QLabel`
- **依据**:笔误:QLabel 误写为 QLable。
## [58954540:img] merge+typo
- **原文**`显示图片示例分散在 3 块(QPixmap pixmap; pixmap.load(:/Image/boat.jpg); label.setPixmap(pixmap) 用了 . 而非 ->`
- **修正**`合并为一个目标,修正 .→->,资源 :/Image/boat.jpg 由生成占位 png + .qrc 提供`
- **依据**:原文 label 是 QLabel* 却用 . 调用 setPixmapC++ 指针须用 ->);三块拆开不可编译。
## [58954540:movie] merge+typo
- **原文**`显示动画示例分散在 3 块(QMovie(:/Mario.gif)、movie->start()、QLabel 全角分号 ;`
- **修正**`合并为一个目标,全角分号→半角,资源 :/Mario.gif 由生成占位 gif + .qrc 提供`
- **依据**:原文 QLabel 定义末尾用了全角分号 ;(C++ 非法);三块拆开不可编译。
## [58954540:15] h+cpp-merge
- **原文**`自定义控件 SmallWidget 在 wiki 中以 smallwidget.h 内联展示(Q_OBJECT + spin/slider/layout/connect`
- **修正**`输出为单 .cpp(含类定义+main 实例化),保留 Qt5 static_cast 重载解析写法`
- **依据**:原 wiki 把类定义放 .h 注释块;按「每目标单文件」输出,AUTOMOC 处理 Q_OBJECT。
## [58954546:0] syntax+merge
- **原文**`EventLabel 事件重写程序:QString("...(%1, %2)\n...") 内误入字面换行(断行)导致字符串未终结;类声明与实现分散`
- **修正**`合并为单 .cpp,字符串内换行移除(\n 移出字符串或删除),补 setMouseTracking`
- **依据**:原 wiki 的 QString 字面量在源码中跨行书写(实际是 \n 后跟换行),C++ 字符串字面量不能直接跨行,导致 missing terminating "。修正为单行字符串。同时补 mouseTracking。
## [58954546:2] member-def-harness
- **原文**`CustomWidget::event(QEvent*) override 片段(处理 KeyPress/Tab)缺少所属类骨架与 main`
- **修正**`补 CustomWidget : public QWidget 骨架(含 event override+ main 外壳,行为对照原文`
- **依据**:原 wiki 只给成员函数定义,缺少类声明与 main;按「示例相对隔离」补齐使其可编译运行。
## [58954546:6] class+main-harness
- **原文**`事件过滤器 MainWindoweventFilter override + installEventFilter)片段缺 main 与完整结构`
- **修正**`补完整 MainWindow(含 QLabel、eventFilter、installEventFilter+ main 外壳`
- **依据**:原 wiki 给出 MainWindow 类骨架但缺 main;补齐使其可编译运行,演示事件过滤机制。
## [58954548:0] h+cpp-merge
- **原文**`PaintedWidget 类声明(10.1 block0)与其构造+paintEvent 实现(block1)分两块`
- **修正**`合并为单 .cppQ_OBJECT 类 + paintEvent),补 main 外壳演示 drawLine/Rect/Ellipse`
- **依据**:原文类声明与成员实现分属两块;按「每目标单文件」合并,AUTOMOC 处理 Q_OBJECT。
## [58954548:2] member-def-harness
- **原文**`PaintWidget::paintEvent 绘 pixmap/bitmap(引用 :/Image/butterfly.png、butterfly1.png`
- **修正**`补 PaintWidget 类骨架 + main,资源由生成占位 png + .qrc 提供`
- **依据**:原 wiki 仅给成员函数定义,缺类骨架与 main;资源图片用占位 png 提供以可编译运行。
## [58954548:3] member-def-harness
- **原文**`PaintWidget::paintEvent 绘 QImagesetPixel 循环逐像素设色)片段`
- **修正**`补 PaintWidget 类骨架 + main 外壳`
- **依据**:原 wiki 仅给成员函数定义,缺类骨架与 main;补齐使其可编译运行。
## [58954548:4] platform-path
- **原文**`QPicture 保存路径为 "D:\ndrawing.pic"Windows 路径,且 \n 被解析为换行符)`
- **修正**`改为相对路径 "drawing.pic"(跨平台可移植)`
- **依据**:原路径是 Windows 绝对路径,\n 在字符串中被当作换行符导致路径错误;改为相对路径使示例在 Linux 下可编译运行。
## [58954552:0] blocking-event-loop
- **原文**`原文用 QApplication + app.exec()(阻塞 GUI 事件循环),但示例实为控制台文件操作`
- **修正**`改用 QCoreApplication,文件 IO 完成后直接 return 0(不进事件循环)`
- **依据**QApplication::exec() 进入 GUI 事件循环会一直阻塞;该示例不创建窗口,仅做文件读写,用 QCoreApplication 并直接返回即可正确退出,便于自动化运行验证。原行为不变。
## [58954552:data] merge
- **原文**`二进制读写示例分散在 3 块(写/读/读写),各自引用 file.dat 且未检查 open() 返回值`
- **修正**`合并为一个程序:先写 file.dat 再读回,补 open() 检查,用 QCoreApplication(无需 GUI`
- **依据**:原文三块是读写示例的不同片段,独立不可编译;合并为完整程序。补 open() 检查避免未定义行为;数据文件 file.dat 程序自建。
## [58954552:text] merge
- **原文**`文本读写示例分散在 2 块(写/读),各自引用 file.txt`
- **修正**`合并为一个程序:先写 file.txt 再逐行读回,用 QCoreApplication(无需 GUI`
- **依据**:原文两块是读写示例的不同片段,独立不可编译;合并为完整程序。