QT信号和槽函数学习笔记
//connect 函數(shù)有4個(gè)參數(shù) 分別是 發(fā)送者 信號(hào)。接受者 ,槽
//connect(sender,signal,receiver,slot)
/*
* 信號(hào)和槽
* 信號(hào) 就是一個(gè)普通的函數(shù) 定義信號(hào)的時(shí)候需要在函數(shù)前面加上signals: ,不需要實(shí)現(xiàn)
* 槽 函數(shù) 在QT5中科院是類的任意成員函數(shù),靜態(tài)函數(shù),全局函數(shù) lambda 表達(dá)式
* QT4中槽函數(shù)的定義 public slots: void send();
* 信號(hào)和槽是可以自定義的
* 信號(hào)和槽是沒有返回值的
* 信號(hào)和槽函數(shù)可以帶參數(shù)
* 信號(hào)和槽函數(shù)的參數(shù)必須要一一對(duì)應(yīng)的
* 信號(hào)和槽函數(shù)的參數(shù)可以是不一樣的但是槽函數(shù)的參數(shù)個(gè)數(shù)可以少于信號(hào)的參數(shù)個(gè)數(shù)
* 信號(hào)槽函數(shù)傳參數(shù)的數(shù)據(jù)類型:
* 先看QT4的
* connect(sender,SIGNAL(sig1(int,double,Qstring)),receiver,SLOT(slot1(int,double,Qstring)));
* SIGNAL 和SLOT 是兩個(gè)宏 將函數(shù)轉(zhuǎn)換成字符串
* 缺點(diǎn) 編譯時(shí)不會(huì)做錯(cuò)誤檢查
* QT5中
* connect(sender,&sender::sig1,receiver,&receiver::slot1);
*/
//創(chuàng)建一個(gè)按鈕對(duì)象
QPushButton * Lpbutton =new QPushButton;
//將按鈕添加到主窗口中 設(shè)置按鈕的父窗口句柄
Lpbutton->setParent(this);
//設(shè)置按鈕的標(biāo)題title
Lpbutton->setText("關(guān)閉窗口");
//信號(hào)和槽的簡(jiǎn)單實(shí)現(xiàn)
//qt5的方式
// connect(Lpbutton,&QPushButton::clicked,this,&MyWidget::close);
//Qt4的方式
connect(Lpbutton,SIGNAL(clicked(bool)),this,SLOT(close()));
自定義信號(hào)和槽函數(shù)的使用
創(chuàng)建兩個(gè)類 一個(gè)報(bào)紙類一個(gè)讀者類
報(bào)紙類先聲明 信號(hào)和發(fā)送信號(hào)的函數(shù)
//然后我們定義一個(gè)發(fā)送信號(hào)的函數(shù)
void SendSignals();
signals:
//自定義一個(gè)信號(hào)
void signalFunc(); //沒有返回值 不需要實(shí)現(xiàn)
然后 我們來實(shí)現(xiàn)發(fā)送信號(hào)的函數(shù)
void NewSpaper::SendSignals()
{
//這個(gè)函數(shù)的主要作用就是發(fā)送信號(hào)
//在QT中我們要發(fā)送信號(hào)的話需要用到關(guān)鍵字emit信號(hào)的函數(shù)名
emit signalFunc();
}
下面我們?cè)賮硖幚碜x者類的槽函數(shù)
public slots:
//讀者類中我們需要自定義一個(gè)槽函數(shù)
void SlostFunc();
實(shí)現(xiàn)槽函數(shù)功能
void Reader::SlostFunc()
{
//我們來實(shí)現(xiàn)以下槽函數(shù) 這里需要用到 控制臺(tái)打印調(diào)試信息所以我們需要用到
//一個(gè)QDebug類
qDebug() <<"我要去買報(bào)紙";
}
連接信號(hào)和槽函數(shù)
//創(chuàng)建讀者類和報(bào)紙類
NewSpaper* NewSpa1 =new NewSpaper;
Reader* Read1 = new Reader;
//連接信號(hào)和槽
connect(NewSpa1,&NewSpaper::signalFunc,Read1,&Reader::SlostFunc);
//然后是發(fā)送信號(hào)
NewSpa1->SendSignals();
當(dāng)然信號(hào)和槽函數(shù)在c++中是一個(gè)普通的函數(shù) 它也存在重載機(jī)制
下面我們來重載信號(hào)和槽函數(shù)
重載報(bào)紙的構(gòu)造函數(shù)
explicit NewSpaper(QString name,QObject *parent = 0);
//重載信號(hào)
void signalFunc(QString name); //沒有返回值 不需要實(shí)現(xiàn)
NewSpaper::NewSpaper(QString name,QObject *parent) : QObject(parent)
{
Qs_name = name;
}
void NewSpaper::SendSignals()
{
//這個(gè)函數(shù)的主要作用就是發(fā)送信號(hào)
//在QT中我們要發(fā)送信號(hào)的話需要用到關(guān)鍵字emit信號(hào)的函數(shù)名
emit signalFunc();
emit signalFunc(Qs_name);
}
重載讀者的槽函數(shù)
//重載槽函數(shù)
void SlostFunc(QString name);
//重載槽函數(shù)
void Reader::SlostFunc(QString name)
{
qDebug() <<"我要去買:"<<name.toStdString().c_str();
}
Reader* Read1 = new Reader;
NewSpaper* NewSpa2 =new NewSpaper("人民日?qǐng)?bào)"); //重載信號(hào)函數(shù)
//連接信號(hào)和槽
// connect(NewSpa1,&NewSpaper::signalFunc,Read1,&Reader::SlostFunc);
//QT4方式實(shí)現(xiàn)重載信號(hào)槽函數(shù)的連接
// connect(NewSpa2,SIGNAL(signalFunc(QString)),Read1,SLOT(SlostFunc(QString)));
//QT5方式實(shí)現(xiàn)重載信號(hào)槽函數(shù)的連接 主要是用到類型轉(zhuǎn)換 函數(shù)指針轉(zhuǎn)換即可
connect(NewSpa2,static_cast<void (NewSpaper::*)(QString)>(&NewSpaper::signalFunc),Read1,static_cast<void (Reader::*)(QString)>(&Reader::SlostFunc));
//然后是發(fā)送信號(hào)
NewSpa2->SendSignals();
QT中信號(hào)和槽的擴(kuò)展
//信號(hào)和槽的擴(kuò)展
/*
* 一個(gè)信號(hào)可以連接多個(gè)槽函數(shù)
* 槽函數(shù)的執(zhí)行順序是隨機(jī)的無法控制
* 一個(gè)槽函數(shù)可以同時(shí)被多個(gè)信號(hào)連接
* 槽函數(shù)可以使用lambda表達(dá)式
* 信號(hào)可以連接信號(hào)可以接力
* 先連接第一個(gè)信號(hào)槽
* connect(NewSpa2,static_cast<void (NewSpaper::*)()>(&NewSpaper::signalFunc),Read1,static_cast<void (Reader::*)()>(&Reader::SlostFunc));
* 然后再連接第二個(gè)信號(hào)槽
* connect(Lpbutton,&QPushButton::clicked,NewSpa2,static_cast<void (NewSpaper::*)()>(&NewSpaper::signalFunc));
* 信號(hào)槽連接之后可以被斷開。可以使用disconnect函數(shù)斷開
*
*/
轉(zhuǎn)載于:https://www.cnblogs.com/guolongzheng/p/7726338.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的QT信号和槽函数学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql慢查询工具
- 下一篇: VisualVM介绍使用