Files
张宗平 01b264fe97 Day4 教学示例补三个:QDialog 综合 / QLineEdit 小眼睛 / 文件 IO(+顶层构建注册)
- qdialog_showcase:wiki「6 对话框 QDialog」6.2–6.5 综合演示。含两套实现:
  · Designer 表单版(dialog.{h,cpp,ui} + resources.qrc + source.gif,QMovie 播 GIF)
  · 纯代码版(qt_dialog_showcase.cpp,单文件,QWidget 布满按钮逐个演示 QDialog 行为)
- lineedit_eye_toggle:子类化 QLineEdit,paintEvent 自绘小眼睛、mouseEvent 命中切换
  echoMode,并与内置 clear button 动态避让(读 objectName=="clearButton" 子 widget 几何)。
  含独立子目录 CMakeLists.txt 供单独打开(顶层 add_subdirectory 不递归)。
- file_io_demo:QFile/QTextStream/QDataStream/QFileInfo/QDir/QTextCodec/QJson 五主题
  综合示例,每个按钮产出一个文件落到 demo_output/ 便于课堂手动查看。

构建注册:examples/CMakeLists.txt 用 add_teaching_example 注册前两个纯代码示例,
mandelbrot 多源文件单独 add_executable;calculator_mainwindow_qss 加 themes.qrc 与
AUTORCC;all_teaching_examples 依赖列表同步补齐。

附 lineedit_eye_toggle 设计文档(docs/superpowers/specs)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-09 16:51:09 +08:00

165 lines
9.0 KiB
CMake
Raw Permalink 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.
# 手工维护 —— 不是 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
# 一致。需要 AUTOUICadd_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.15.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。无 QSSQSS 在下午版)。
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.26.5):
# QWidget 布满 pushbutton,每个按钮演示一种 QDialog 行为。纯代码(无 .ui),
# 单文件,走 add_teaching_example。
add_teaching_example(qt_dialog_showcase qdialog_showcase)
# QLineEdit 自绘小眼睛 / echo mode 切换(Day4 上午:组件绘制 + 事件捕捉 + clear button 避让):
# 子类化 QLineEditpaintEvent 自绘眼睛、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)