13b3ebbe14
把川大 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 运行通过。
8.2 KiB
8.2 KiB
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 QWidget(Q_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* 却用 . 调用 setPixmap(C++ 指针须用 ->);三块拆开不可编译。
[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
- 原文:
事件过滤器 MainWindow(eventFilter override + installEventFilter)片段缺 main 与完整结构 - 修正:
补完整 MainWindow(含 QLabel、eventFilter、installEventFilter)+ main 外壳 - 依据:原 wiki 给出 MainWindow 类骨架但缺 main;补齐使其可编译运行,演示事件过滤机制。
[58954548:0] h+cpp-merge
- 原文:
PaintedWidget 类声明(10.1 block0)与其构造+paintEvent 实现(block1)分两块 - 修正:
合并为单 .cpp(Q_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 绘 QImage(setPixel 循环逐像素设色)片段 - 修正:
补 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) - 依据:原文两块是读写示例的不同片段,独立不可编译;合并为完整程序。