Files
scuc-qt-course/docs/teaching/examples/state_machine/qt_state_machine.cpp
T
张宗平 1f66098277 Qt 示例窗口默认不再自动退出,仅离屏验证时自动退出
p03/ 生成产物与 docs/teaching/examples/ 手工示例里的 QTimer::singleShot
自动退出逻辑,从"始终 200ms 后退出"改为"仅当 QT_QPA_PLATFORM=offscreen
时才退出"。正常运行(有显示环境)窗口保持打开,需手动关闭;离屏自动化
验证(tools/run_qt.sh + QT_QPA_PLATFORM=offscreen)行为不变。

p03/ 改动来自重新生成 tools/gen_part3.py(AUTO_QUIT 常量加 qgetenv 判断),
未手改生成产物。QCoreApplication 控制台风格示例(qfile_basic 等)本就
执行完即退出,不受影响。
2026-07-02 16:14:49 +08:00

51 lines
2.4 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();
// 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen):100ms 后模拟一次点击
// red -> green),再等 200ms 确认状态机正常处理完过渡后自动退出。
// 正常运行(有显示环境)需用户手动点击按钮切换状态,窗口保持打开。
if (qgetenv("QT_QPA_PLATFORM") == "offscreen") {
QTimer::singleShot(100, &button, [&button]() { button.click(); });
QTimer::singleShot(300, &app, &QApplication::quit);
}
return app.exec();
}