Qt信号和槽
connect函數(shù)把按鈕的點(diǎn)擊事件和窗口的處理函數(shù)close關(guān)聯(lián)了起來。
需要注意的是:發(fā)送的信號(hào)函數(shù)的參數(shù)個(gè)數(shù)一定要比槽函數(shù)的參數(shù)多,且類型一樣,否則會(huì)報(bào)錯(cuò).
自定義信號(hào)和槽
1:信號(hào)函數(shù)的編寫
signals://自定義信號(hào) 寫道signals下//返回值時(shí) void 只需要申明 不需要實(shí)現(xiàn)//可以有參數(shù) 可以重載void hungry();2:槽函數(shù)的編寫
.h類定義 public slots://qt5.0以后 槽函數(shù)可以寫在public下,也可以是全局函數(shù)//返回值void 需要申明 也需要實(shí)現(xiàn)//可以有參數(shù) 可以重載void treat(); };.cpp類實(shí)現(xiàn) void Student::treat() {qDebug()<<"請(qǐng)老師吃飯"; }3:使用connect連接
connect(yxp,&Teacher::hungry,ly,&Student::treat);4:發(fā)射信號(hào)
也就是調(diào)用到hungry函數(shù)
自定義的信號(hào)和槽發(fā)生重載的解決
當(dāng)信號(hào)函數(shù)或者槽函數(shù)有重載的情況時(shí),在connect時(shí),需要定義函數(shù)指針的方式明確是哪一個(gè)重載函數(shù)。
例如:
#ifndef TEACHER_H #define TEACHER_H#include <QObject>class Teacher : public QObject {Q_OBJECT public:explicit Teacher(QObject *parent = nullptr);signals://自定義信號(hào) 寫道signals下//返回值時(shí) void 只需要申明 不需要實(shí)現(xiàn)//可以有參數(shù) 可以重載void hungry();void hungry(QString); //在這里有重載的情況 public slots: };#endif // TEACHER_H #ifndef STUDENT_H #define STUDENT_H#include <QObject>class Student : public QObject {Q_OBJECT public:explicit Student(QObject *parent = nullptr);signals://自定義信號(hào) 寫道signals下//返回值時(shí) void 只需要申明 不需要實(shí)現(xiàn)//可以有參數(shù) 可以重載 public slots://qt5.0以后 槽函數(shù)可以寫在public下,也可以是全局函數(shù)//返回值void 需要申明 也需要實(shí)現(xiàn)//可以有參數(shù) 可以重載void treat();void treat(QString foodName); };#endif // STUDENT_H// 構(gòu)造函數(shù)的實(shí)現(xiàn)在cpp中 void Student::treat() {qDebug()<<"請(qǐng)老師吃飯"; }void Student::treat(QString foodName) {qDebug()<<"請(qǐng)老師吃飯,老師要吃"<<foodName.toUtf8().data(); }窗口類包含測試的兩個(gè)類指針
#ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include "teacher.h" #include "student.h" class myWidget : public QWidget {Q_OBJECTprivate:Teacher *yxp;Student *ly; public:myWidget(QWidget *parent = 0);void clasIsOver();~myWidget(); };#endif // MYWIDGET_H在窗口類的構(gòu)造函數(shù)中,實(shí)現(xiàn)的發(fā)射信號(hào)
#include "mywidget.h" #include "qpushbutton.h"myWidget::myWidget(QWidget *parent): QWidget(parent) {//創(chuàng)建一個(gè)老師對(duì)象this->yxp=new Teacher(this);//創(chuàng)建一個(gè)學(xué)生對(duì)象this->ly=new Student(this);//定義函數(shù)指針 重載時(shí)就必須這樣指明要調(diào)用的是哪一個(gè)函數(shù)void (Teacher::*teacherSingal)(QString)=&Teacher::hungry;void (Student::*studentSlot)(QString)=&Student::treat;connect(yxp,teacherSingal,ly,studentSlot);clasIsOver(); }void myWidget::clasIsOver() {//emit 代表要發(fā)射信號(hào)了 是一個(gè)宏定義 為空emit yxp->hungry("魚香肉絲"); }myWidget::~myWidget() {}信號(hào)連接信號(hào)
創(chuàng)建一個(gè)按鈕,點(diǎn)擊按鈕發(fā)送信號(hào),在這里用類的成員函數(shù)當(dāng)成槽函數(shù).
myWidget::myWidget(QWidget *parent): QWidget(parent) {//創(chuàng)建一個(gè)老師對(duì)象this->yxp=new Teacher(this);//創(chuàng)建一個(gè)學(xué)生對(duì)象this->ly=new Student(this);//定義函數(shù)指針void (Teacher::*teacherSingal)(void)=&Teacher::hungry;void (Student::*studentSlot)(void)=&Student::treat;connect(yxp,teacherSingal,ly,studentSlot);QPushButton *btn=new QPushButton("點(diǎn)擊觸發(fā)信號(hào)",this);this->resize(600,400);//信號(hào)連接信號(hào),這里使用沒有參數(shù)的teacherSingal是因?yàn)镼PushButton::clicked的參數(shù)為bool類型.而我們自己定義的信號(hào)teacherSingal有參數(shù)是QString的.//會(huì)產(chǎn)生類型不匹配的問題 ,這里值得注意connect(btn,&QPushButton::clicked,yxp,teacherSingal);}信號(hào)斷開連接
關(guān)閉指定對(duì)象的所有信號(hào)
disconnect(myObject, 0, 0, 0);等同于下面的寫法
myObject->disconnect();關(guān)閉指定信號(hào)的所有連接
disconnect(myObject, SIGNAL(mySignal()), 0, 0);等同于下面的寫法
myObject->disconnect(SIGNAL(mySignal()));斷開指定的接收者的連接
disconnect(myObject, 0, myReceiver, 0);等同于下面的寫法
myObject->disconnect(myReceiver);Lambda表達(dá)式
c++11中的Lambda表達(dá)式用于定義并創(chuàng)建匿名的函數(shù)對(duì)象,以簡化編程工作
[函數(shù)對(duì)象參數(shù)](操作符重載函數(shù)參數(shù))mutable->返回值{函數(shù)體}[]:函數(shù)對(duì)象參數(shù)標(biāo)志一個(gè)Lambda的開始,這部分必須存在不能省略.
空: 沒有使用任何函數(shù)對(duì)象參數(shù)
=:函數(shù)體內(nèi)可以使用Lambda所在作用范圍內(nèi)所有課件的局部變量,(包括Lambda所在類的this),并且是值傳遞方式,所有的局部變量都是只讀,不可以修改的.
3)&:函數(shù)體內(nèi)可以使用Lambda所在作用范圍內(nèi)所有課件的局部變量,(包括Lambda所在類的this),并且是引用傳遞方式,修改傳過來的值,會(huì)影響原來的局部變量.可以修改外部傳過來的局部變量.
4)a :把局部變量a按值傳入函數(shù)體中,函數(shù)體中只能使用該變量
5)&a :把局部變量a引用傳遞到函數(shù)體中,函數(shù)體中只能使用該變量,可以修改該變量的值,外部也會(huì)改變.
6)mutable:該關(guān)鍵字的作用是表明可以修改按值傳遞進(jìn)來的拷貝,而不是值本身.(內(nèi)部修改,不影響外部),
myWidget::myWidget(QWidget *parent): QWidget(parent) {QPushButton *btn=new QPushButton("點(diǎn)擊觸發(fā)信號(hào)",this);this->resize(600,400);[=](){btn->setText("修改按鈕");}();//最后加的(),代表調(diào)用一次匿名函數(shù) }在connect函數(shù)中使用Lambda表達(dá)式
//connect函數(shù)最后一個(gè)參數(shù)可以使用Lambda表達(dá)式,更加易于傳參數(shù)進(jìn)去,因?yàn)橛袝r(shí)候信號(hào)會(huì)限制槽函數(shù)的參數(shù)類型及個(gè)數(shù).//而使用Lambda表達(dá)式完美的解決了這個(gè)問題connect(btn,&QPushButton::clicked,this,[=](){ emit clasIsOver();});返回值
int ret=[]()->int{return 0;}(); //->int 表明返回值是int類型總結(jié)
- 上一篇: Tian Ji -- The Horse
- 下一篇: 金蝶云星空与巨益OMS对接集成采购退料查