一、什么是信號和槽?
我們經??吹降墓δ?,點擊一個按鈕實現(xiàn)窗口關閉。
這一過程發(fā)生了什么?是怎么實現(xiàn)的
按鈕相當于一個信號,點擊相當于發(fā)送一個信號,窗口是個接收者,關閉窗口是個槽函數
信號:各種事件
槽:響應信號的動作
當一個按鈕(信號)被觸發(fā)(發(fā)送的信號),某個信號接收到(信號的接收者)就會做出相應的處理動作(槽函數)。他們是怎么建立連接的呢?要想實現(xiàn)這功能我們需要應用到這個api connect()來建立他們四者的關系。
二、connect的實現(xiàn)以及demo實例
1.連接函數 connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
參數說明:
參數1:信號的發(fā)送者
參數2:發(fā)送的信號(函數地址)
參數3:信號的接受者
參數4:處理的槽函數(函數的地址)
實現(xiàn)一個按下按鈕關閉窗口的demo
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//重置窗口大小
resize(600,400);
//創(chuàng)建一個按鈕
QPushButton *btn = new QPushButton("按鈕",this);
//設置到對象樹中
btn->setParent(this);
//移動按鈕
btn->move(100,50);
//點擊我的按鈕,關閉窗口
connect(btn,QPushButton::clicked,this,QWidget::close);
}
Widget::~Widget()
{
delete ui;
}
2、松散耦合
信號和槽的優(yōu)點:松散耦合,信號的發(fā)送端和接收端本身是沒有關聯(lián)的,通過connect連接,將兩端耦合在一起。
三、自定義信號和槽
3.1、自定義信號實現(xiàn)說明
1、寫到signal下
2、返回void
3、需要聲明,不需要實現(xiàn)
4、可以有參數,可以重載
3.2、自定義的槽函數實現(xiàn)說明
1、返回void
2、需要聲明,也需要實現(xiàn)
3、可以有參數,可以重載
4、可以寫到public slot下或者public或者全局函數(早期QT版本,必須要寫到public slots,高級版本可以寫到public或者全局函數)
1.自定義一個信號和槽函數demo實現(xiàn):下課了,小明觸發(fā)一個信號,想去打游戲,小張響應信號,一起打王者
//創(chuàng)建兩個類,Ming,Zhang 基類是QObject
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//創(chuàng)建一個小明對象
this->xm = new Ming;
//創(chuàng)建一個小張對象
this->xz = new Zhang;
connect(xm,Ming::playGame,xz,Zhang::playLol);
classIsOver();
}
//封裝一個下課函數,調用emit觸發(fā)玩游戲的信號
void Widget::classIsOver()
{
emit xm->playGame();
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include "zhang.h"
#include "ming.h"
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
Ming *xm;
Zhang *xz;
void classIsOver();
};
#endif // WIDGET_H
ming.h
#ifndef MING_H
#define MING_H
#include <QObject>
class Ming : public QObject
{
Q_OBJECT
public:
explicit Ming(QObject *parent = 0);
signals:
void playGame();
public slots:
};
#endif // MING_H
zhang.h
#ifndef ZHANG_H
#define ZHANG_H
#include <QObject>
class Zhang : public QObject
{
Q_OBJECT
public:
explicit Zhang(QObject *parent = 0);
signals:
public slots:
void playLol();
};
#endif // ZHANG_H
zhang.cpp
#include "zhang.h"
#include <QDebug>
Zhang::Zhang(QObject *parent) : QObject(parent)
{
}
void Zhang::playLol()
{
qDebug()<<"一起打王者";
}
2.自定義帶參一個信號和槽函數demo實現(xiàn):下課了,小明觸發(fā)一個信號,想去打游戲,小張響應信號,一起打王者,角色是安琪拉
//創(chuàng)建兩個類,Ming,Zhang 基類是QObject
widget.cpp
#include <QPushButton>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//創(chuàng)建一個小明對象
this->xm = new Ming;
//創(chuàng)建一個小張對象
this->xz = new Zhang;
//用函數指針傳遞函數地址
void(Ming:: *mingSignal)(QString) = Ming::playGame;
void(Zhang:: *zhangSignal)(QString) = Zhang::playLol;
connect(xm,mingSignal,xz,zhangSignal);
classIsOver();
}
//封裝一個下課函數,調用emit觸發(fā)玩游戲的信號
void Widget::classIsOver()
{
emit xm->playGame("安琪拉");
}
Widget::~Widget()
{
delete ui;
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include "zhang.h"
#include "ming.h"
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private:
Ui::Widget *ui;
Ming *xm;
Zhang *xz;
void classIsOver();
};
#endif // WIDGET_H
ming.h
#ifndef MING_H
#define MING_H
#include <QObject>
class Ming : public QObject
{
Q_OBJECT
public:
explicit Ming(QObject *parent = 0);
signals:
void playGame(QString roleName);
public slots:
};
#endif // MING_H
zhang.h
#ifndef ZHANG_H
#define ZHANG_H
#include <QObject>
class Zhang : public QObject
{
Q_OBJECT
public:
explicit Zhang(QObject *parent = 0);
signals:
public slots:
void playLol(QString roleName);
};
#endif // ZHANG_H
zhang.cpp
#include "zhang.h"
#include <QDebug>
Zhang::Zhang(QObject *parent) : QObject(parent)
{
}
void Zhang::playLol(QString roleName)
{
qDebug()<<"一起打王者,角色:"<<roleName.toUtf8().data();
}
**四、QString 轉char ***
//QString轉char方法:先轉成QByteArray(.toUtf8()) .data()再轉char
qDebug()<<"打王者,角色是:"<<roleName.toUtf8().data();
}
五、信號和槽之間的關系
1、信號可以連接信號
2、信號可以連接多個信號
3、一個信號可以連接多個槽
4、多個信號可以連接同一個槽
5、信號和槽的參數一一對應
6、信號和槽的參數個數 是不是要一致?未必,信號的參數個數可以多于槽函數的參數個數
六、Lambda表達式
C++中的Lambda表達式用于定義并創(chuàng)建匿名的函數對象,以簡化編程工作。
1.[]標識符 匿名函數
2.= 值傳遞
3.&引用傳遞
4.()參數
5.{}實現(xiàn)體
6.mutable修飾值傳遞變量,可以修改拷貝出的數據,改變不了本體
7.返回值[M]->int []文章來源:http://www.zghlxwxcb.cn/news/detail-466472.html
利用lambda表達式,實現(xiàn)點擊按鈕關閉窗口的demo文章來源地址http://www.zghlxwxcb.cn/news/detail-466472.html
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
resize(600,400);
//創(chuàng)建一個按鈕
QPushButton *btn = new QPushButton("按鈕",this);
//設置到對象樹中
btn->setParent(this);
//移動按鈕
btn->move(100,50);
//點擊我的按鈕,關閉窗口
connect(btn,QPushButton::clicked,this,[=](){
this->close();
qDebug()<<"窗口關閉";
});
}
Widget::~Widget()
{
delete ui;
}
到了這里,關于QT之信號和槽的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!