From 1f660982772ec46600eef1aa67dc652b1701b7f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AE=97=E5=B9=B3?= Date: Thu, 2 Jul 2026 16:14:49 +0800 Subject: [PATCH] =?UTF-8?q?Qt=20=E7=A4=BA=E4=BE=8B=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E4=B8=8D=E5=86=8D=E8=87=AA=E5=8A=A8=E9=80=80?= =?UTF-8?q?=E5=87=BA=EF=BC=8C=E4=BB=85=E7=A6=BB=E5=B1=8F=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E6=97=B6=E8=87=AA=E5=8A=A8=E9=80=80=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 等)本就 执行完即退出,不受影响。 --- README.md | 3 ++- .../examples/model_view/qt_model_view_basics.cpp | 9 ++++++--- .../property_animation/qt_property_animation.cpp | 9 ++++++--- .../examples/qss_styling/qt_qss_styling.cpp | 9 ++++++--- .../examples/state_machine/qt_state_machine.cpp | 13 ++++++++----- p03/ch02/minimal_qt_app.cpp | 9 ++++++--- p03/ch03/button_creation.cpp | 9 ++++++--- p03/ch04/builtin_signal_slot.cpp | 9 ++++++--- p03/ch04/custom_signal_slot.cpp | 9 ++++++--- p03/ch04/lambda_signal_slot.cpp | 9 ++++++--- p03/ch05/central_widget.cpp | 9 ++++++--- p03/ch05/dock_widget.cpp | 9 ++++++--- p03/ch06/file_dialog.cpp | 9 ++++++--- p03/ch06/message_box_custom.cpp | 9 ++++++--- p03/ch06/message_box_question.cpp | 9 ++++++--- p03/ch06/modal_dialog.cpp | 9 ++++++--- p03/ch06/modeless_dialog_deleteonclose.cpp | 9 ++++++--- p03/ch06/modeless_dialog_heap.cpp | 9 ++++++--- p03/ch06/modeless_dialog_stack.cpp | 9 ++++++--- p03/ch08/custom_widget.cpp | 9 ++++++--- p03/ch08/label_movie.cpp | 9 ++++++--- p03/ch08/label_pixmap.cpp | 9 ++++++--- p03/ch08/label_text_create.cpp | 9 ++++++--- p03/ch08/label_text_html.cpp | 9 ++++++--- p03/ch09/event_filter_mainwindow.cpp | 9 ++++++--- p03/ch09/event_override_customwidget.cpp | 9 ++++++--- p03/ch09/mouse_event.cpp | 9 ++++++--- p03/ch10/paint_device_pixmaps.cpp | 9 ++++++--- p03/ch10/paint_device_qimage.cpp | 9 ++++++--- p03/ch10/qpainter_basic.cpp | 9 ++++++--- p03/ch10/qpicture_io.cpp | 9 ++++++--- p03/ch11/qdatastream_io.cpp | 2 +- p03/ch11/qfile_basic.cpp | 2 +- p03/ch11/qtextstream_io.cpp | 2 +- tools/gen_part3.py | 14 +++++++++----- 35 files changed, 196 insertions(+), 101 deletions(-) diff --git a/README.md b/README.md index 89ebe05..cd3363d 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,8 @@ QT_QPA_PLATFORM=offscreen tools/run_qt.sh > **隔离验证**:`ldd build/p03/.../` 显示所有 Qt 库只解析到 `.qt514/`, > 零系统 Qt 引用。顶层 `CMakeLists.txt` 有版本断言——误连系统 Qt 5.15 会 `FATAL_ERROR`。 -> 每个 Qt GUI 目标注入 `QTimer::singleShot` 让程序 200ms 后自动退出,便于离屏验证。 +> 每个 Qt GUI 目标注入 `QTimer::singleShot`,仅当 `QT_QPA_PLATFORM=offscreen` 时才在 +> 200ms 后自动退出,便于离屏验证;正常运行窗口保持打开,不自动退出。 ## 目录命名(深缩写) diff --git a/docs/teaching/examples/model_view/qt_model_view_basics.cpp b/docs/teaching/examples/model_view/qt_model_view_basics.cpp index 8dafbd2..dd12be3 100644 --- a/docs/teaching/examples/model_view/qt_model_view_basics.cpp +++ b/docs/teaching/examples/model_view/qt_model_view_basics.cpp @@ -3,7 +3,7 @@ // 用途:方案书「C++方向 Day3」要求的 Model/View 模型视图架构,仓库 p03/ 原有 // wiki 抓取内容未覆盖这一点,故补一个最小示例。 // 配套文档:docs/teaching/examples/model_view/README.md -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_model_view_basics +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_model_view_basics(自动退出) // ============================================================================ #include @@ -53,8 +53,11 @@ int main(int argc, char* argv[]) { ModelViewDemo w; w.resize(280, 220); w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/docs/teaching/examples/property_animation/qt_property_animation.cpp b/docs/teaching/examples/property_animation/qt_property_animation.cpp index 08840c9..e4913a4 100644 --- a/docs/teaching/examples/property_animation/qt_property_animation.cpp +++ b/docs/teaching/examples/property_animation/qt_property_animation.cpp @@ -3,7 +3,7 @@ // 用途:方案书「C++方向 Day4」要求的 QPropertyAnimation 动画框架,仓库 p03/ // 原有 wiki 抓取内容未覆盖这一点,故补一个最小示例。 // 配套文档:docs/teaching/examples/property_animation/README.md -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_property_animation +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_property_animation(自动退出) // ============================================================================ #include @@ -32,7 +32,10 @@ int main(int argc, char* argv[]) { anim->start(QAbstractAnimation::DeleteWhenStopped); window.show(); - // 离屏/自动化验证:动画时长 800ms,额外等 300ms 确保播放完再退出 - QTimer::singleShot(1100, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)自动退出:动画时长 800ms, + // 额外等 300ms 确保播放完再退出;正常运行窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(1100, &app, &QApplication::quit); + } return app.exec(); } diff --git a/docs/teaching/examples/qss_styling/qt_qss_styling.cpp b/docs/teaching/examples/qss_styling/qt_qss_styling.cpp index fb89062..8779170 100644 --- a/docs/teaching/examples/qss_styling/qt_qss_styling.cpp +++ b/docs/teaching/examples/qss_styling/qt_qss_styling.cpp @@ -3,7 +3,7 @@ // 用途:方案书「C++方向 Day2」要求的 QSS 界面美化,仓库 p03/ 原有 wiki 抓取内容 // 未覆盖这一点,故补一个最小示例。 // 配套文档:docs/teaching/examples/qss_styling/README.md -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_qss_styling +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_qss_styling(自动退出) // ============================================================================ #include @@ -50,8 +50,11 @@ int main(int argc, char* argv[]) { StyledPanel panel; panel.resize(240, 160); panel.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/docs/teaching/examples/state_machine/qt_state_machine.cpp b/docs/teaching/examples/state_machine/qt_state_machine.cpp index 0f09059..b4e4e5a 100644 --- a/docs/teaching/examples/state_machine/qt_state_machine.cpp +++ b/docs/teaching/examples/state_machine/qt_state_machine.cpp @@ -4,7 +4,7 @@ // 不需要额外模块),仓库 p03/ 原有 wiki 抓取内容未覆盖这一点,故补一个 // 最小示例:一个“红灯/绿灯”两态按钮,点击在两态间切换。 // 配套文档:docs/teaching/examples/state_machine/README.md -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_state_machine +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh qt_state_machine(自动退出) // ============================================================================ #include @@ -39,9 +39,12 @@ int main(int argc, char* argv[]) { button.show(); - // 离屏/自动化验证:100ms 后模拟一次点击(red -> green), - // 再等 200ms 确认状态机正常处理完过渡后自动退出 - QTimer::singleShot(100, &button, [&button]() { button.click(); }); - QTimer::singleShot(300, &app, &QApplication::quit); + // 仅在离屏自动化验证时(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(); } diff --git a/p03/ch02/minimal_qt_app.cpp b/p03/ch02/minimal_qt_app.cpp index 7ca343a..809f3ed 100644 --- a/p03/ch02/minimal_qt_app.cpp +++ b/p03/ch02/minimal_qt_app.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954515:0] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -22,8 +22,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); Widget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch03/button_creation.cpp b/p03/ch03/button_creation.cpp index 7696199..ec62219 100644 --- a/p03/ch03/button_creation.cpp +++ b/p03/ch03/button_creation.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954525:0] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -36,8 +36,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); DemoWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch04/builtin_signal_slot.cpp b/p03/ch04/builtin_signal_slot.cpp index b1f3052..84737e6 100644 --- a/p03/ch04/builtin_signal_slot.cpp +++ b/p03/ch04/builtin_signal_slot.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954527:0] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -28,8 +28,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); DemoWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch04/custom_signal_slot.cpp b/p03/ch04/custom_signal_slot.cpp index 9ecde50..67b9372 100644 --- a/p03/ch04/custom_signal_slot.cpp +++ b/p03/ch04/custom_signal_slot.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954527:2] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -60,8 +60,11 @@ public: int main(int argc, char* argv[]) { QApplication app(argc, argv); MyWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch04/lambda_signal_slot.cpp b/p03/ch04/lambda_signal_slot.cpp index 5837a87..ba69788 100644 --- a/p03/ch04/lambda_signal_slot.cpp +++ b/p03/ch04/lambda_signal_slot.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954527:6] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -34,8 +34,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); DemoWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch05/central_widget.cpp b/p03/ch05/central_widget.cpp index a1cc4e3..c78f8d4 100644 --- a/p03/ch05/central_widget.cpp +++ b/p03/ch05/central_widget.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954529:5] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -25,8 +25,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); DemoMainWindow w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch05/dock_widget.cpp b/p03/ch05/dock_widget.cpp index 96a7f8e..19152fa 100644 --- a/p03/ch05/dock_widget.cpp +++ b/p03/ch05/dock_widget.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954529:4] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -29,8 +29,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); DemoMainWindow w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch06/file_dialog.cpp b/p03/ch06/file_dialog.cpp index 2f11bb4..cc294d4 100644 --- a/p03/ch06/file_dialog.cpp +++ b/p03/ch06/file_dialog.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954535:12] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -60,8 +60,11 @@ private slots: int main(int argc, char* argv[]) { QApplication app(argc, argv); MainWindow w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch06/message_box_custom.cpp b/p03/ch06/message_box_custom.cpp index 1068048..97f75ee 100644 --- a/p03/ch06/message_box_custom.cpp +++ b/p03/ch06/message_box_custom.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954535:11] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -47,8 +47,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); DemoWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch06/message_box_question.cpp b/p03/ch06/message_box_question.cpp index ecb2cf0..f2832bb 100644 --- a/p03/ch06/message_box_question.cpp +++ b/p03/ch06/message_box_question.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954535:10] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -39,8 +39,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); DemoWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch06/modal_dialog.cpp b/p03/ch06/modal_dialog.cpp index 9fc9971..6ccbfa2 100644 --- a/p03/ch06/modal_dialog.cpp +++ b/p03/ch06/modal_dialog.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954535:0] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -28,8 +28,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); DemoWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch06/modeless_dialog_deleteonclose.cpp b/p03/ch06/modeless_dialog_deleteonclose.cpp index d1bacac..bc06434 100644 --- a/p03/ch06/modeless_dialog_deleteonclose.cpp +++ b/p03/ch06/modeless_dialog_deleteonclose.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954535:3] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -29,8 +29,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); DemoWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch06/modeless_dialog_heap.cpp b/p03/ch06/modeless_dialog_heap.cpp index 03f0c75..0c8a4db 100644 --- a/p03/ch06/modeless_dialog_heap.cpp +++ b/p03/ch06/modeless_dialog_heap.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954535:2] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -28,8 +28,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); DemoWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch06/modeless_dialog_stack.cpp b/p03/ch06/modeless_dialog_stack.cpp index 2197664..61b3208 100644 --- a/p03/ch06/modeless_dialog_stack.cpp +++ b/p03/ch06/modeless_dialog_stack.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954535:1] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -28,8 +28,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); DemoWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch08/custom_widget.cpp b/p03/ch08/custom_widget.cpp index 9358de7..8d0e119 100644 --- a/p03/ch08/custom_widget.cpp +++ b/p03/ch08/custom_widget.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954540:15] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -36,8 +36,11 @@ public: int main(int argc, char* argv[]) { QApplication app(argc, argv); SmallWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch08/label_movie.cpp b/p03/ch08/label_movie.cpp index 201fd16..e458086 100644 --- a/p03/ch08/label_movie.cpp +++ b/p03/ch08/label_movie.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954540:movie] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -29,8 +29,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); DemoWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch08/label_pixmap.cpp b/p03/ch08/label_pixmap.cpp index 17ff6ea..1a11db6 100644 --- a/p03/ch08/label_pixmap.cpp +++ b/p03/ch08/label_pixmap.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954540:img] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -29,8 +29,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); DemoWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch08/label_text_create.cpp b/p03/ch08/label_text_create.cpp index 7eff4d7..d92b000 100644 --- a/p03/ch08/label_text_create.cpp +++ b/p03/ch08/label_text_create.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954540:1] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -25,8 +25,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); DemoWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch08/label_text_html.cpp b/p03/ch08/label_text_html.cpp index 5e7e3f4..c844e6f 100644 --- a/p03/ch08/label_text_html.cpp +++ b/p03/ch08/label_text_html.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954540:2] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -27,8 +27,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); DemoWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch09/event_filter_mainwindow.cpp b/p03/ch09/event_filter_mainwindow.cpp index 4944216..87bd9fa 100644 --- a/p03/ch09/event_filter_mainwindow.cpp +++ b/p03/ch09/event_filter_mainwindow.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954546:6] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -39,8 +39,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); MainWindow w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch09/event_override_customwidget.cpp b/p03/ch09/event_override_customwidget.cpp index 56ed245..9d00bba 100644 --- a/p03/ch09/event_override_customwidget.cpp +++ b/p03/ch09/event_override_customwidget.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954546:2] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -35,8 +35,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); CustomWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch09/mouse_event.cpp b/p03/ch09/mouse_event.cpp index 84aaba9..eb83535 100644 --- a/p03/ch09/mouse_event.cpp +++ b/p03/ch09/mouse_event.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954546:0] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -41,8 +41,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); EventLabel w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch10/paint_device_pixmaps.cpp b/p03/ch10/paint_device_pixmaps.cpp index 9a679eb..2bfb2b9 100644 --- a/p03/ch10/paint_device_pixmaps.cpp +++ b/p03/ch10/paint_device_pixmaps.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954548:2] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -36,8 +36,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); PaintWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch10/paint_device_qimage.cpp b/p03/ch10/paint_device_qimage.cpp index ad53ca0..11a82e5 100644 --- a/p03/ch10/paint_device_qimage.cpp +++ b/p03/ch10/paint_device_qimage.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954548:3] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -36,8 +36,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); PaintWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch10/qpainter_basic.cpp b/p03/ch10/qpainter_basic.cpp index fa7dc35..72122f9 100644 --- a/p03/ch10/qpainter_basic.cpp +++ b/p03/ch10/qpainter_basic.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954548:0] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -32,8 +32,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); PaintedWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch10/qpicture_io.cpp b/p03/ch10/qpicture_io.cpp index 3ed2983..4814992 100644 --- a/p03/ch10/qpicture_io.cpp +++ b/p03/ch10/qpicture_io.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954548:4] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include @@ -41,8 +41,11 @@ int main(int argc, char* argv[]) { QApplication app(argc, argv); PaintWidget w; w.show(); - // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞) - QTimer::singleShot(200, &app, &QApplication::quit); + // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; + // 正常运行(有显示环境)窗口保持打开,不自动退出。 + if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { + QTimer::singleShot(200, &app, &QApplication::quit); + } return app.exec(); } diff --git a/p03/ch11/qdatastream_io.cpp b/p03/ch11/qdatastream_io.cpp index 51f2f82..bb73f90 100644 --- a/p03/ch11/qdatastream_io.cpp +++ b/p03/ch11/qdatastream_io.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954552:data] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include diff --git a/p03/ch11/qfile_basic.cpp b/p03/ch11/qfile_basic.cpp index 17fac31..f2fc11e 100644 --- a/p03/ch11/qfile_basic.cpp +++ b/p03/ch11/qfile_basic.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954552:0] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include diff --git a/p03/ch11/qtextstream_io.cpp b/p03/ch11/qtextstream_io.cpp index 1ede7ee..566b842 100644 --- a/p03/ch11/qtextstream_io.cpp +++ b/p03/ch11/qtextstream_io.cpp @@ -4,7 +4,7 @@ // 原文片段:[58954552:text] // 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication // 外壳、include、修正笔误)。详见 docs/ERRATA.md。 -// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh +// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出) // ============================================================================ #include diff --git a/tools/gen_part3.py b/tools/gen_part3.py index 4815597..a73203e 100644 --- a/tools/gen_part3.py +++ b/tools/gen_part3.py @@ -10,8 +10,9 @@ # 外壳包裹,必要时补所需 QWidget/QMainWindow 子类骨架。 # - 'snippet' 纯签名/单语句/伪代码,不单独建目标,折进各章 README 作文档。 # * 每个目标 = 一个独立 add_executable;开 AUTOMOC(Q_OBJECT 类需 moc)。 -# * 离屏运行友好:每个目标注入一个 QTimer::singleShot 让程序 200ms 后自动退出, -# 便于 QT_QPA_PLATFORM=offscreen 自动化验证(窗口类目标)。 +# * 离屏运行友好:每个窗口类目标注入一个 QTimer::singleShot,仅当检测到 +# QT_QPA_PLATFORM=offscreen 时才在 200ms 后自动退出;正常运行(有显示环境) +# 窗口保持打开,不会自动关闭。 # * 资源依赖(:/images/*.png 等)用脚本生成的纯色占位 png + .qrc 提供,qt5_add_resources。 # * Qt 代码修正(笔误/平台/过时 API)每处 record_erratum 进 docs/ERRATA.md(透明可审计)。 # @@ -275,8 +276,11 @@ TARGET_DATAFILES = { # 外壳模板:把一个「片段」包成可运行的 Qt 程序 # ============================================================================== AUTO_QUIT = ( - " // 离屏/自动化验证:200ms 后自动退出(GUI 模式下不阻塞)\n" - " QTimer::singleShot(200, &app, &QApplication::quit);\n" + " // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出;\n" + " // 正常运行(有显示环境)窗口保持打开,不自动退出。\n" + " if (qgetenv(\"QT_QPA_PLATFORM\") == \"offscreen\") {\n" + " QTimer::singleShot(200, &app, &QApplication::quit);\n" + " }\n" ) AUTO_QUIT_CORE = ( " QTimer::singleShot(0, &app, &QCoreApplication::quit);\n" @@ -373,7 +377,7 @@ def header_comment(pid, idx, stem): f"// 原文片段:[{pid}:{idx}]\n" "// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication\n" "// 外壳、include、修正笔误)。详见 docs/ERRATA.md。\n" - "// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh \n" + "// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh (自动退出)\n" "// ============================================================================\n\n" )