// ============================================================================ // 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 (自动退出) // ============================================================================ #include #include #include #include #include #include // ---- 老师(发送者):饿了就发信号 ---- 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::of 显式选择重载 connect(t, QOverload::of(&Teacher::hungry), s, QOverload::of(&Student::treat)); // 触发演示 t->classIsOver(); } }; int main(int argc, char* argv[]) { QApplication app(argc, argv); MyWidget w; w.show(); // 仅在离屏自动化验证时(QT_QPA_PLATFORM=offscreen)200ms 后自动退出; // 正常运行(有显示环境)窗口保持打开,不自动退出。 if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { QTimer::singleShot(200, &app, &QApplication::quit); } return app.exec(); } #include "custom_signal_slot.moc"