# 手工维护 —— 不是 tools/gen_part3.py 的生成产物,重新生成 p01/p03 不会影响这里。 # # 教学补充示例:方案书「C++方向」课程要求、但仓库 p03/(wiki 抓取内容)未覆盖 # 的技术点,每个子目录一个最小可运行 Qt 程序 + 配套 README.md 教学文档。 # 不计入 README.md/CLAUDE.md 里「144+29=173 个目标」的生成器目标计数。 function(add_teaching_example name dir) add_executable(${name} ${dir}/${name}.cpp) set_target_properties(${name} PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON) target_link_libraries(${name} PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets) target_compile_options(${name} PRIVATE -Wall -Wextra) endfunction() add_teaching_example(qt_qss_styling qss_styling) add_teaching_example(qt_model_view_basics model_view) add_teaching_example(qt_json_parse_write json_io) add_teaching_example(qt_thread_worker qthread_worker) add_teaching_example(qt_property_animation property_animation) add_teaching_example(qt_state_machine state_machine) # 坑点最小复现示例(OUTLINE_4DAY.md §9.2):默认跑「正确写法」离屏可验证退出码 0, # 错误写法一律用命令行开关现场触发(--crash / --dangle),不影响自动化验证。 add_teaching_example(qt_pitfall_stack_widget pitfall_stack_widget) add_teaching_example(qt_pitfall_lambda_capture pitfall_lambda_capture) add_teaching_example(qt_pitfall_double_connect pitfall_double_connect) add_teaching_example(qt_table_widget_basics table_widget) # Day2 下午案例参考实现(OUTLINE_4DAY.md Day2 下午「简易计算器」) add_teaching_example(qt_calculator calculator) # Day2 案例的 Qt Designer(.ui) 对照版:界面用表单设计、业务逻辑与 qt_calculator # 一致。需要 AUTOUIC(add_teaching_example 只开 AUTOMOC),单独写 target。 add_executable(qt_calculator_designer calculator_designer/qt_calculator_designer.cpp calculator_designer/calculator_designer.ui) set_target_properties(qt_calculator_designer PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON AUTOUIC ON) target_link_libraries(qt_calculator_designer PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets) target_compile_options(qt_calculator_designer PRIVATE -Wall -Wextra) # Day2 增强版计算器(calculator_designer_ext):在 Designer 版基础上把「立即计算」 # 升级为「表达式求值」——独立 ExpressionEvaluator 用递归下降解析器实现运算符优先级 # 与括号(含嵌套、未闭合自动补全)。多源文件 + .ui 表单,单独写 target。 # 注意:子目录里那个 Qt Creator 导出的 CMakeLists.txt 不参与仓库构建(C++11 / # 目标名 Calculator / ANDROID 分支均不符仓库 C++17 规范),构建一律走本 target。 add_executable(qt_calculator_designer_ext calculator_designer_ext/main.cpp calculator_designer_ext/calculatordesigner.cpp calculator_designer_ext/expressionevaluator.cpp calculator_designer_ext/widget.ui) target_include_directories(qt_calculator_designer_ext PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/calculator_designer_ext) set_target_properties(qt_calculator_designer_ext PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON AUTOUIC ON) target_link_libraries(qt_calculator_designer_ext PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets) target_compile_options(qt_calculator_designer_ext PRIVATE -Wall -Wextra) # Day5 综合案例参考实现(OUTLINE_4DAY.md §3 / §9.3) add_teaching_example(qt_student_manager student_manager) # QMainWindow 教学综合示例(wiki「5 QMainWindow」pageId 58954529 的 5.1–5.6 全组件): # form designer(.ui) 定义主窗体结构、.qrc 资源文件提供应用图标。单独写 target # (标准 add_teaching_example 只开 AUTOMOC,本例还需 AUTOUIC+AUTORCC)。 add_executable(qt_mainwindow_showcase mainwindow_showcase/main.cpp mainwindow_showcase/mainwindow_showcase.cpp mainwindow_showcase/mainwindow_showcase.h mainwindow_showcase/mainwindow.ui mainwindow_showcase/mainwindow.qrc) set_target_properties(qt_mainwindow_showcase PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON AUTOUIC ON AUTORCC ON) target_link_libraries(qt_mainwindow_showcase PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets) target_compile_options(qt_mainwindow_showcase PRIVATE -Wall -Wextra) # Day3 上午版参考实现:把 Day2 增强版计算器装进 QMainWindow(菜单/状态栏/历史停靠窗)。 # 复用 Day2 的 calculatordesigner + expressionevaluator + widget.ui(自包含复制), # 新增 mainwindow.{h,cpp} 外壳 + 含 runSelfTest 的 main.cpp。无 QSS(QSS 在下午版)。 add_executable(qt_calculator_mainwindow calculator_mainwindow/main.cpp calculator_mainwindow/mainwindow.cpp calculator_mainwindow/calculatordesigner.cpp calculator_mainwindow/expressionevaluator.cpp calculator_mainwindow/widget.ui) target_include_directories(qt_calculator_mainwindow PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/calculator_mainwindow) set_target_properties(qt_calculator_mainwindow PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON AUTOUIC ON) target_link_libraries(qt_calculator_mainwindow PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets) target_compile_options(qt_calculator_mainwindow PRIVATE -Wall -Wextra) # Day3 下午版参考实现:上午版 + QSS 双主题美化。复用上午版同款 5 文件(自包含复制), # 仅 mainwindow.{h,cpp} 加双主题 QSS + 视图菜单「深色主题」、main.cpp 自测加主题断言。 add_executable(qt_calculator_mainwindow_qss calculator_mainwindow_qss/main.cpp calculator_mainwindow_qss/mainwindow.cpp calculator_mainwindow_qss/calculatordesigner.cpp calculator_mainwindow_qss/expressionevaluator.cpp calculator_mainwindow_qss/widget.ui calculator_mainwindow_qss/themes.qrc) target_include_directories(qt_calculator_mainwindow_qss PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/calculator_mainwindow_qss) set_target_properties(qt_calculator_mainwindow_qss PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON AUTOUIC ON AUTORCC ON) target_link_libraries(qt_calculator_mainwindow_qss PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets) target_compile_options(qt_calculator_mainwindow_qss PRIVATE -Wall -Wextra) # QDialog 教学综合示例(wiki「6 对话框 QDialog」pageId 183664881 的 6.2–6.5): # QWidget 布满 pushbutton,每个按钮演示一种 QDialog 行为。纯代码(无 .ui), # 单文件,走 add_teaching_example。 add_teaching_example(qt_dialog_showcase qdialog_showcase) # QLineEdit 自绘小眼睛 / echo mode 切换(Day4 上午:组件绘制 + 事件捕捉 + clear button 避让): # 子类化 QLineEdit,paintEvent 自绘眼睛、mouseEvent 命中切换 echoMode,与内置 clear button # 动态避让(读 objectName=="clearButton" 子 widget 几何)。子目录另有独立 CMakeLists.txt # 供单独打开(不走这里:顶层 add_subdirectory 不递归)。 add_teaching_example(qt_lineedit_eye_toggle lineedit_eye_toggle) # Day4 综合演示示例(事件机制 + QPainter 绘图 + 多线程):Mandelbrot 分形渲染器。 # 三段式对比(主线程卡死 / 后台单线程 / 后台多线程),滚轮缩放 + 拖拽平移 + 分块并行。 # 多源文件(无 .ui/.qrc),单独写 target;子目录另有独立 CMakeLists.txt 供单独打开 # (不走这里:顶层 add_subdirectory 不递归),与 lineedit_eye_toggle 同模式。 add_executable(qt_mandelbrot_renderer mandelbrot_renderer/main.cpp mandelbrot_renderer/mandelbrot_widget.cpp mandelbrot_renderer/mandelbrot_strip_task.cpp) target_include_directories(qt_mandelbrot_renderer PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/mandelbrot_renderer) set_target_properties(qt_mandelbrot_renderer PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF AUTOMOC ON) target_link_libraries(qt_mandelbrot_renderer PRIVATE Qt5::Core Qt5::Gui Qt5::Widgets) target_compile_options(qt_mandelbrot_renderer PRIVATE -Wall -Wextra) # Qt5 文件操作教学综合示例(QFile/QTextStream/QDataStream/QFileInfo/QDir/QTextCodec/QJson): # 一个 QWidget 布满按钮,5 个主题(基础IO/编码/文本vs二进制/异常处理/QJson),每个按钮 # 产生一个文件落到 demo_output/(可执行文件同目录),方便课堂手动打开查看。纯代码单文件。 add_teaching_example(qt_file_io_demo file_io_demo) add_custom_target(all_teaching_examples DEPENDS qt_qss_styling qt_model_view_basics qt_json_parse_write qt_thread_worker qt_property_animation qt_state_machine qt_pitfall_stack_widget qt_pitfall_lambda_capture qt_pitfall_double_connect qt_table_widget_basics qt_calculator qt_calculator_designer qt_calculator_designer_ext qt_student_manager qt_mainwindow_showcase qt_calculator_mainwindow qt_calculator_mainwindow_qss qt_dialog_showcase qt_lineedit_eye_toggle qt_mandelbrot_renderer qt_file_io_demo)