C++Qt入門(2)---訊號和槽
阿新 • • 發佈:2021-01-26
文章目錄
三、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)訊號的引數個數可以多餘槽的引數個數