Files
scuc-qt-course/docs/teaching/examples/state_machine/qt_state_machine.cpp
T
张宗平 83620c0cf5 教案对齐官方方案书:重写为 5 天 C++/Qt 教学设计,补齐 6 个 Qt 技术缺口示例
- docs/teaching/OUTLINE.md、slides/day1-5.html、index.html:替换此前自定义的
  4 天方案,严格对齐 docs/TRAINING_PLAN_2026.md「C++方向」Day1-5 课堂内容
  (Day6-10 为纯项目实作,不在教案范围)
- docs/teaching/examples/:官方方案书要求但仓库 p03/(wiki 抓取内容) 未覆盖的
  QSS/Model-View/JSON/QThread/QPropertyAnimation/QStateMachine 六个技术点,
  各补一个最小可运行示例 + README 教学文档,均已离屏验证跑通;手工维护,
  不属于 gen_part3.py 生成产物
- 根 CMakeLists.txt:接入 docs/teaching/examples 构建(BUILD_QT_PART 分支内),
  不改动生成器管理的 p01/p03 CMakeLists
- 任务卡改为目标/验收标准/基础知识参考三段式模板,custom.css 配套新增样式
- docs/teaching/PRETEST.md:10 题 10 分钟 C++ 摸底测验,验证教案假定的受众
  基础是否成立,并与 OUTLINE.md §0 的分层预案挂钩
2026-07-02 11:31:44 +08:00

48 lines
2.2 KiB
C++
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.
// ============================================================================
// qt_state_machine —— 教学补充示例(非 wiki 生成,手工维护)
// 用途:方案书「C++方向 Day4」要求的状态机实战(QStateMachine 属于 QtCore
// 不需要额外模块),仓库 p03/ 原有 wiki 抓取内容未覆盖这一点,故补一个
// 最小示例:一个“红灯/绿灯”两态按钮,点击在两态间切换。
// 配套文档:docs/teaching/examples/state_machine/README.md
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_state_machine
// ============================================================================
#include <QApplication>
#include <QPushButton>
#include <QStateMachine>
#include <QState>
#include <QTimer>
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
QPushButton button;
button.resize(140, 40);
QStateMachine machine;
auto* redState = new QState(&machine);
auto* greenState = new QState(&machine);
// 进入某个状态时执行的动作:改文本、改样式——状态机负责“流转”,
// 具体每个状态“长什么样”交给 assignProperty/连接槽函数。
redState->assignProperty(&button, "text", QStringLiteral("红灯:禁止通行"));
redState->assignProperty(&button, "styleSheet", QStringLiteral("background-color:#c0392b;color:white;"));
greenState->assignProperty(&button, "text", QStringLiteral("绿灯:允许通行"));
greenState->assignProperty(&button, "styleSheet", QStringLiteral("background-color:#27ae60;color:white;"));
// 点击按钮触发状态切换:red --clicked--> green --clicked--> red ...
redState->addTransition(&button, &QPushButton::clicked, greenState);
greenState->addTransition(&button, &QPushButton::clicked, redState);
machine.setInitialState(redState);
machine.start();
button.show();
// 离屏/自动化验证:100ms 后模拟一次点击(red -> green),
// 再等 200ms 确认状态机正常处理完过渡后自动退出
QTimer::singleShot(100, &button, [&button]() { button.click(); });
QTimer::singleShot(300, &app, &QApplication::quit);
return app.exec();
}