// ============================================================================
//  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=offscreen）200ms 后自动退出；
    // 正常运行（有显示环境）窗口保持打开，不自动退出。
    if (qgetenv("QT_QPA_PLATFORM") == "offscreen") {
        QTimer::singleShot(200, &app, &QApplication::quit);
    }
    return app.exec();
}

#include "custom_signal_slot.moc"
