柚子快報(bào)激活碼778899分享:開發(fā)語(yǔ)言 QT自定義信號(hào)和槽
柚子快報(bào)激活碼778899分享:開發(fā)語(yǔ)言 QT自定義信號(hào)和槽
Qt框架默認(rèn)提供的標(biāo)準(zhǔn)信號(hào)和槽不足以完成我們?nèi)粘?yīng)用開發(fā)的需求,比如說點(diǎn)擊某個(gè)按鈕讓另一個(gè)按鈕的文字改變,這時(shí)候標(biāo)準(zhǔn)信號(hào)和槽就沒有提供這樣的函數(shù)。但是Qt信號(hào)和槽機(jī)制提供了允許我們自己設(shè)計(jì)自己的信號(hào)和槽。
1、自定義信號(hào)使用條件
? ?聲明在類的signals域下
? ?沒有返回值,void類型的函數(shù)
? ? 只有函數(shù)聲明,沒有定義
? ? 可以有參數(shù),可以重載
? ? 通過emit關(guān)鍵字來觸發(fā)信號(hào),形式:emit object->sig(參數(shù))
2、自定義槽函數(shù)使用條件
? ?qt4 必須聲明在 private/public/protected slots域下面,qt5之后可以聲明public下,同時(shí)還可以是靜態(tài)的成員函數(shù),全局函數(shù),lambda表達(dá)式
? 沒有返回值,void類型的函數(shù)
? 不僅有聲明,還得要有實(shí)現(xiàn)
? ?可以有參數(shù),可以重載
3、使用自定義信號(hào)和槽
定義場(chǎng)景:下課了,老師跟同學(xué)說肚子餓了(信號(hào)),學(xué)生請(qǐng)老師吃飯(槽)
首先定義一個(gè)學(xué)生類和老師類:
老師類中聲明信號(hào) 餓了 hungry
signals:
?? ????void hungry();
學(xué)生類中聲明槽 請(qǐng)客treat
public slots:
??? ???void treat();
在窗口中聲明一個(gè)公共方法下課,這個(gè)方法的調(diào)用會(huì)觸發(fā)老師餓了這個(gè)信號(hào),而響應(yīng)槽函數(shù)學(xué)生請(qǐng)客
void MyWidget::ClassIsOver()
{
??? //發(fā)送信號(hào)
??? emit teacher->hungry();
}
學(xué)生響應(yīng)了槽函數(shù),并且打印信息
//自定義槽函數(shù) 實(shí)現(xiàn)
void Student::treat()
{
?? ????qDebug() << "Student treat teacher";
}
在窗口中連接信號(hào)槽
? ?
?teacher = new Teacher(this);
??? student = new Student(this);
??? connect(teacher,&Teacher::hungury,student,&Student::treat);
并且調(diào)用下課函數(shù),測(cè)試打印出相應(yīng)log
自定義的信號(hào) hungry帶參數(shù),需要提供重載的自定義信號(hào)和 自定義槽
void hungry(QString name);? 自定義信號(hào)
void treat(QString name );??? 自定義槽
但是由于有兩個(gè)重名的自定義信號(hào)和自定義的槽,直接連接會(huì)報(bào)錯(cuò),所以需要利用函數(shù)指針來指向函數(shù)地址, 然后在做連接
void (Teacher:: * teacherSingal)(QString) = &Teacher:: hangry;
void (Student:: * studentSlot)(QString) = &Student::treat;
connect(teacher,teacherSingal,student,studentSlot);
也可以使用static_cast靜態(tài)轉(zhuǎn)換挑選我們要的函數(shù)
connect(
teacher,
static_cast
student,
static_cast
柚子快報(bào)激活碼778899分享:開發(fā)語(yǔ)言 QT自定義信號(hào)和槽
推薦閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。