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

8.2 KiB
Raw Blame History

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
  • 依据:原文两块是读写示例的不同片段,独立不可编译;合并为完整程序。