Benutzerdefinierte Signale und Slots von Qt

        Das benutzerdefinierte Signal sollte unter Signal geschrieben werden und der Rückgabewert ist ungültig. Es muss nur deklariert werden und muss nicht implementiert werden. Es kann Parameter haben und kann überladen werden. Die frühe Version der Slot-Funktion muss unter öffentlichen Slots geschrieben werden, und die erweiterte Version kann unter öffentlichen oder globalen Slots geschrieben werden. Der Rückgabewert ist void, der deklariert (behandelt) werden muss und implementiert werden muss (in cpp). kann Parameter haben und überladen sein. Wenn Sie es verwenden, müssen Sie das Signal und den Steckplatz verbinden und den Auslöser geben (senden).

Die Anforderung dieses Mal lautet: Nach dem Unterricht sende ich ein Signal --> hungrig --> mein Freund empfängt das Signal --> antworte und lade mich zum Abendessen ein . Diesmal werden zwei Klassen benötigt: Meine Klasse und die Freundesklasse, die jeweils mir und meinem Freund entsprechen. Diesmal werden nur die Operationen mit Parametern ausgeführt. Verfahren:

① Fügen Sie zunächst zwei zu QObject gehörende Klassen mit den Namen My und MyFriend hinzu.

② Deklarieren Sie das Objekt- und Entlassungssignal in widget.h

    // 对象声明
    My * my;
    MyFriend * fri;

    void classover();

③ Slot-Funktionsdeklaration in firend.h

public:
    explicit MyFriend(QObject *parent = nullptr);
    
    // 槽函数:早期版本必须写到public slots下    高级版本可以写到public或者全局下
    // 返回值void,需要声明(treat),需要实现(cpp中)
    // 可以有参数,可以发生重载
    void treat(QString foodName);

④ Deklarieren Sie das Signal in my.h

signals:
    // 自定义信号 写到signal下
    // 返回值是 void ,只需要声明,不需要实现
    // 可以有参数,可以重载
    void hungry(QString foodName);  // 说饿了并且说吃什么

⑤ Definieren Sie die Funktion in friends.cpp

void MyFriend::treat(QString foodName)
{
    // 把QString转换成 char * 形式在输出的foodname就不会带""  
    // 先用(.toUtf8)转成QByteArray(字节数组型)再(.data())转char *
    qDebug()<<"我朋友请我吃饭,我要吃:" << foodName.toUtf8().data();
}

⑥ Verbinden Sie sich in widget.cpp:

        (1) Erstelle Objekte von mir und meinem Freund

    // 创建一个我的对象
    this->my = new My(this);   // 指定好父类后,new之后就不需要管释放了
    // 创建一个朋友的对象
    this->fri = new MyFriennd(this);

        (2) Schaffung einer Entlassungsfunktion zum Verlassen des Unterrichts

void Widget::classover()
{
// 下课后函数,调用后 触发我饿了的信号
    // 触发的关键字 emit
    emit my->hungry("肥牛鱼粉");
}

        (3) Benutzerdefinierte Signale und Slots mit Parametern verbinden

    // 连接含参的 信号和槽
    // 指针可以指向地址,函数指针指向函数地址
    void( My:: *mySingal )(QString) = &My::hungry;
    void( MyFriend:: *friSlot )(QString) = &MyFriend::treat;
    connect(my,mySingal,fri,friSlot);

        (4) Tasteneinstellung und Verbindung

    // 点击 下课按钮  触发下课
    QPushButton * btn = new QPushButton("下课",this);
    this->resize(600,400);  // 重置窗口大小,resize是窗口this下的方法

    // 点击按钮,触发下课
    connect(btn,&QPushButton::clicked,this,&Widget::classover);   // 信号连接槽

        (5) testen

        Klicken Sie auf die Schaltfläche „Unterricht verlassen“ und beobachten Sie die Ausgabe in der Anwendungsleiste.

Ergänzungsteil:

① Signalverbindungssignal

    connect(te,teacherSingal,st,studentSlot);    
    connect(btn,&QPushButton::clicked,my,mySingal);
    // 先连接 friSlot 和 mySingal ,再连接 mySingal 和 &QPushButton::clicked
    // ① 在触发QPushButton::clicked(点击按钮)时   ② 通过中介 mySingal    ③ 触发 friSlot

② Trennen

// 断开 friSlot 和 mySingal 之间的连接
   disconnect(my,mySingal,fri,friSlot);

Hinweis : ① Ein Signal kann mit einem Signal verbunden werden; ② Ein Signal kann mit mehreren Steckplatzfunktionen verbunden werden; ③ Mehrere Signale können mit einer Steckplatzfunktion verbunden werden;   

        ④Die Parametertypen der Signal- und Slot-Funktionen müssen nacheinander übereinstimmen; ⑤Die Anzahl der Signalparameter ≥ die Anzahl der Slot-Funktionsparameter .  

③ Lambda-Ausdruck:

Das Grundformat wird zum Definieren und Erstellen anonymer Funktionsobjekte verwendet und lautet wie folgt:

connect(btn,&QPushButton::clicked,this,[x](){

});

1. [ x ] ist der Anfang des Ausdrucks und kann nicht weggelassen werden. x hat die folgenden Werte:

        (1) [=] ist die Methode zur Wertübertragung, was bedeutet, dass alle sichtbaren lokalen Variablen im Bereich verwendet werden können, einschließlich dieser Methode, die am häufigsten verwendet wird, und der folgenden, die nicht häufig verwendet werden;

        (2) Die Wirkung von [=] ist äquivalent zu [&], wobei & die Art der Referenzübergabe darstellt;

        (3) [dies] Alle Mitgliedsvariablen der Klasse, in der sich das Lambda befindet, können im Hauptteil der Funktion verwendet werden;

        (4) [a] Übergeben Sie a als Wert, innerhalb von {} kann nur a übergeben werden, andere Variablen werden nicht erkannt und im Allgemeinen nur zum Ändern eines Mitglieds verwendet. [&b] Übergeben Sie b als Referenz;

        (5) [=,&a,&b] außer a, b wird als Referenz übergeben und andere werden als Wert übergeben;

        (6) [=, a, b] Außer a wird b als Referenzwert übergeben, und andere werden als Referenz übergeben;

2. Funktionsrückgabewert: -> Rückgabewerttyp, der Datentyp davor und danach muss konsistent sein;

3. Der Inhalt im Implementierungskörper {} ist der Teil, der implementiert werden muss, was dem Einfügen einer Reihe von Signalfunktionen in die Slot-Funktion entspricht.

Ich denke du magst

Origin blog.csdn.net/weixin_58351753/article/details/127460453
Empfohlen
Rangfolge