1. 程式人生 > 其它 >C++Qt入門(2)---訊號和槽

C++Qt入門(2)---訊號和槽

技術標籤:C++qt

文章目錄

三、QT中的訊號和槽

使用的方法:
connect(訊號的傳送者,傳送的具體訊號,訊號的接收者,訊號的處理(槽函式))

訊號槽的優點:鬆散耦合,訊號傳送端和接收端本身是沒有關聯的,通過connect連線,將兩端耦合在一起

1.點選按鈕關閉視窗

QPushButton * but2 = new QPushButton("點我關閉視窗",this);
//設定按鈕的大小
but2->resize(200,100);
//重置視窗的大小
resize(600,
400); //需求:點選第二個按鈕,關閉視窗 //connect(訊號的傳送者,傳送的訊號(函式地址),訊號的接收者,處理的槽函式(函式地址)) connect(but2,&QPushButton::clicked,this,&QWidget::close);

2.自定義訊號和槽

(1)自定義訊號
返回值為void,需要宣告,不需要實現,可以有引數,寫在signal下

#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

class Teacher : public QObject
{
    Q_OBJECT
public
: explicit Teacher(QObject *parent = nullptr); //自定義訊號寫到這裡就可以了 signals: //自定義訊號,返回值為void。只需要宣告,不需要實現 //可以有引數,可以過載 void hungry(); void hungry(QString food); public slots: }; #endif // TEACHER_H

(2)自定義槽函式
返回值為void,需要宣告也需要實現,可以有引數,可以重在,寫到public slot下

#ifndef STUDENT_H
#define STUDENT_H
#include
<QObject>
class Student : public QObject { Q_OBJECT public: explicit Student(QObject *parent = nullptr); signals: public slots: //早期版本必須寫在public slot下,高階版本可以寫到public或全域性下 //返回值是void,需要宣告也需要實現,也可以有引數,可過載 void treat(); void treat(QString food); }; #endif // STUDENT_H

(3)觸發自定義的訊號:使用emit關鍵字

emit t->hungry("abc");

(4)過載時出現的問題的解決
a)使用函式指標解決

//使用函式指標進行連線
void(Teacher::*teacher)(void) = &Teacher::hungry;
void(Student::*student)(void) = &Student::treat;
connect(t,teacher,s,student);

b)將QString轉換為char*的方法

//QString轉char*:先轉QByteArray,再轉char*
//QString自帶引號,若想去除引號,則需轉成char*
qDebug() << "老師想吃" << food.toUtf8().data();

3.訊號連線訊號

斷開訊號使用disconnect方法,引數與連線訊號的connect方法的一樣

4.拓展

(1)訊號可以連線訊號
(2)一個訊號可以連線多個槽函式
(3)多個訊號可以連線同一個槽函式
(4)訊號和槽函式的引數型別必須一一對應
(5)訊號的引數個數可以多餘槽的引數個數