Files
scuc-qt-course/p03/ch04/custom_signal_slot.cpp
张宗平 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

72 lines
2.5 KiB
C++
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.
// ============================================================================
// custom_signal_slot — Qt 桌面示例
// 来源:川大 C++/LinuxC wiki「02.Qt方向」
// 原文片段:[58954527:2]
// 说明:本文件由 gen_part3.py 从 wiki 片段生成(必要时补 main/QApplication
// 外壳、include、修正笔误)。详见 docs/ERRATA.md。
// 离屏验证:QT_QPA_PLATFORM=offscreen tools/run_qt.sh <target>(自动退出)
// ============================================================================
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QDebug>
#include <QString>
#include <QTimer>
// ---- 老师(发送者):饿了就发信号 ----
class Teacher : public QObject {
Q_OBJECT
public:
explicit Teacher(QObject* p = nullptr) : QObject(p) {}
signals:
void hungry(); // 无参信号
void hungry(QString food);// 带参信号(重载)
public slots:
void classIsOver() {
emit hungry(); // 触发无参信号
emit hungry(QString("汉堡")); // 触发带参信号
}
};
// ---- 学生(接收者):请客吃饭 ----
class Student : public QObject {
Q_OBJECT
public:
explicit Student(QObject* p = nullptr) : QObject(p) {}
public slots:
void treat() { qDebug() << "老师饿了,请老师吃饭!"; }
void treat(QString food) { qDebug() << "老师饿了,请老师吃" << food; }
};
// ---- 聚合窗口:连接信号槽并触发演示 ----
class MyWidget : public QWidget {
Q_OBJECT
public:
MyWidget() {
Teacher* t = new Teacher(this);
Student* s = new Student(this);
// 连接无参信号/槽
connect(t, QOverload<>::of(&Teacher::hungry),
s, QOverload<>::of(&Student::treat));
// 带参重载:用 QOverload<QString>::of 显式选择重载
connect(t, QOverload<QString>::of(&Teacher::hungry),
s, QOverload<QString>::of(&Student::treat));
// 触发演示
t->classIsOver();
}
};
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
MyWidget w; w.show();
// 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen200ms 后自动退出;
// 正常运行(有显示环境)窗口保持打开,不自动退出。
if (qgetenv("QT_QPA_PLATFORM") == "offscreen") {
QTimer::singleShot(200, &app, &QApplication::quit);
}
return app.exec();
}
#include "custom_signal_slot.moc"