使用無參數信號與槽: 首先定義一個teacher類,該類中用於發送一個信號,其次student類,定義用於接收該信號的槽函數,最后在widget中使用emit觸發信號,當老師說下課時,學生請客吃飯。
teacher.h 中只需要定義信號。定義一個 void hungry(); 信號。
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
// 定義一個信號,信號必須為void類型,且信號不能實現
void hungry();
};
#endif // TEACHER_H
student中需要定義槽聲明,並實現槽。
student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
signals:
public slots:
// 自定義槽函數
// 槽函數必須定義且必須要聲明才可以使用
void treat();
};
#endif // STUDENT_H
student.cpp
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
// 槽函數的實現過程如下
void Student::treat()
{
qDebug() << "請老師吃飯";
}
Widget.h定義信號發送函數,與類
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "student.h"
#include "teacher.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
// 定義學生與老師類
Teacher *zt;
Student *st;
// 定義信號發送函數
void classIsOver();
};
#endif // WIDGET_H
Widget.cpp 具體實現
#include "widget.h"
Widget::Widget(QWidget *parent): QWidget(parent)
{
zt = new Teacher(this);
st = new Student(this);
// zt向st發送信號,信號是&Teacher::hungry 處理槽函數是 &Student::treat
connect(zt,&Teacher::hungry,st,&Student::treat);
classIsOver();
}
Widget::~Widget()
{
}
// 觸發信號
void Widget::classIsOver()
{
emit zt->hungry();
}
使用有參信號傳遞: 只需要再無參基礎上改進
widget.cpp
#include "widget.h"
Widget::Widget(QWidget *parent): QWidget(parent)
{
zt = new Teacher(this);
st = new Student(this);
void(Teacher:: *teacherPtr)(QString) = &Teacher::hungry;
void(Student:: *studentPtr)(QString) = &Student::treat;
connect(zt,teacherPtr,st,studentPtr);
classIsOver();
}
Widget::~Widget()
{
}
// 觸發信號
void Widget::classIsOver()
{
emit zt->hungry("kao'leng'mian烤冷面");
}
student.cpp
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent) : QObject(parent)
{
}
// 槽函數的實現過程如下
void Student::treat()
{
qDebug() << "請老師吃飯";
}
void Student::treat(QString foodName)
{
qDebug() << "請老師吃飯了!,老師要吃:" << foodName.toUtf8().data() ;
}
student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
signals:
public slots:
// 自定義槽函數
// 槽函數必須定義且必須要聲明才可以使用
void treat();
void treat(QString);
};
#endif // STUDENT_H
teacher.h
#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 foodName );
};
#endif // TEACHER_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QString>
#include <QPushButton>
#include "student.h"
#include "teacher.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
// 定義學生與老師類
Teacher *zt;
Student *st;
// 定義信號發送函數
void classIsOver();
};
#endif // WIDGET_H
點擊按鈕觸發信號: 當我們點擊按鈕時,自動觸發信號。只需需改widget中的內容。
Widget::Widget(QWidget *parent): QWidget(parent)
{
st = new Student(this);
tt = new Teacher(this);
QPushButton *btn = new QPushButton("發送郵件",this);
void(Teacher:: *teacherPtr)(void) = &Teacher::send_mail;
void(Student:: *studentPtr)(void) = &Student::read_mail;
// 將btn綁定到button上,點擊后觸發tt 里面的teacherPtr -> 產生信號send_mail;
connect(btn,&QPushButton::clicked,tt,teacherPtr);
// 接着將產生信號綁定到 st 里面的student -> 也就是read_mail槽函數上。
connect(tt,teacherPtr,st,studentPtr);
}
匿名函數與槽
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{
ui->setupUi(this);
// 使用Lambda表達式,其中的[=] 對文件內的變量生效,其中[btn]則是對btn按鈕生效
// 默認會調用一次完成初始化,這是由()決定的函數調用。
[=](){
this->setWindowTitle("初始化..");
}();
// 使用mutable可以改變通過值傳遞的變量
int number = 10;
QPushButton *btn_ptr1 = new QPushButton("改變變量值",this);
btn_ptr1->move(100,100);
// 點擊按鈕改變內部變量的值,由於值傳遞所以不會影響外部變量的變化
connect(btn_ptr1,&QPushButton::clicked,this,[=]()mutable{
number = number + 100;
std::cout << "inner: " << number << std::endl;
});
// 當點擊以下按鈕時number還是原值
QPushButton *btn_ptr2 = new QPushButton("測試值傳遞",this);
btn_ptr2->move(100,200);
connect(btn_ptr2,&QPushButton::clicked,this,[=](){
std::cout << "The Value: " << number << std::endl;
});
// 使用Lambda表達式返回值,有時存在返回的情況
int ref = []()->int{
return 1000;
}();
std::cout << "Return = " << ref << std::endl;
}
1