1.信號和槽
什么叫做信號将鸵,顧名思義,就是某一個物體被干了什么佑颇,而發(fā)出的一種消息顶掉,比如說一個按鈕被鼠標(biāo)點(diǎn)擊了,那他就會發(fā)出一個點(diǎn)擊信號挑胸,告訴別人我被點(diǎn)擊了痒筒。而槽是指在接受到信號之后,具體要去做什么茬贵,比如一個標(biāo)簽在某一個按鈕被點(diǎn)擊之后簿透,接收到了點(diǎn)擊信號,他就會顯示一個笑臉等等闷沥。
信號和槽是QT中最基本的概念萎战,也是QT中最核心的概念。在QT中舆逃,當(dāng)一個信號被發(fā)送時蚂维,是按照類似廣播的方式發(fā)送的戳粒,每一個槽都能看到這個信號,但是只有你連接過的槽才回去接收這個信號并作出相應(yīng)的操作虫啥。打個比方蔚约,信號就是一個妹子,槽函數(shù)就是一個個漢子涂籽,當(dāng)信號被發(fā)送時苹祟,就是這個妹子對所有的漢子說她想找個男朋友,但是所有漢子不一定喜歡這個妹子评雌,所以只有對這個妹子感興趣的漢子才會回應(yīng)這個妹子的要求树枫。
信號和槽分為兩種,一種是類自帶的信號和槽景东,不用實(shí)現(xiàn)可以直接按照C++調(diào)用方法一樣使用砂轻。
我們查看QT中的幫助文檔,查詢你需要的類斤吐,比如我們查找QLabel這個類:
看到類中具體的實(shí)現(xiàn)的信號和槽函數(shù)名搔涝,我想大概就能理解這些信號和槽函數(shù)是用來實(shí)現(xiàn)什么功能的了。
信號和槽還有另一種形式和措,那就是自定義信號和槽庄呈,畢竟你無法要求QT幫你把你所有需要實(shí)現(xiàn)的操作全部封裝好了,這時候就需要自己去實(shí)現(xiàn)信號的發(fā)送和槽的實(shí)現(xiàn)派阱。
自定義信號和槽一般是寫在類構(gòu)造函數(shù)之中的一種QT獨(dú)有的語法诬留,大致和聲明類方法是一樣的:
槽的具體實(shí)現(xiàn)很簡單,就是一個特別點(diǎn)的C++方法颁褂,QT中信號有點(diǎn)特殊故响,在C類語言中傀广,每一個定義了的函數(shù)都必須實(shí)現(xiàn)颁独,不能只簡簡單單的聲明,但是QT中的信號不需要具體實(shí)現(xiàn)伪冰,這是QT中預(yù)處理器Moc實(shí)現(xiàn)的事情誓酒,我們暫時不需要了解,我們只需要知道贮聂,聲明了的槽函數(shù)就必須要實(shí)現(xiàn)靠柑,而信號不需要。
具體的實(shí)例我會在下面的實(shí)例應(yīng)用中具體介紹吓懈。
2.連接格式
還記得前面說的那個妹子和漢子之間的不可告人的故事嗎歼冰?是的,那么要怎么做漢子才能和這個妹子發(fā)生點(diǎn)關(guān)系(不要想歪了)耻警,就是說要如何聲明隔嫡,這個槽函數(shù)才能對特定的信號產(chǎn)生反應(yīng)甸怕。
在QT中,這是一個連接函數(shù)腮恩,他的格式如下:
QObject::connect(發(fā)送者梢杭,信號,接受者秸滴,槽)武契;
這個連接函數(shù)具有4個參數(shù)(當(dāng)然也可以只有3個,接收者可以不需要荡含,但是一般不怎么寫咒唆,了解即可),第一個參數(shù)是發(fā)送者释液,顧名思義钧排,就是誰發(fā)送了這個信號,比如PushButton被點(diǎn)擊了均澳,發(fā)送一個Cliked的信號恨溜,那PushButton就是發(fā)送者,Cliked就是信號找前。同理糟袁,第三個參數(shù)就是誰接收了這個信號。
下面給出一個實(shí)例:
在QT4中躺盛,信號和槽函數(shù)參數(shù)是兩個不同的宏项戴,但是在QT5中,具體寫法如上槽惫。
3.實(shí)例應(yīng)用
在了解了信號和槽的基礎(chǔ)知識之后周叮,我想應(yīng)該很容易就能實(shí)現(xiàn)一些簡單的操作。
接下來我會用一個很簡單的實(shí)例來使用信號和槽界斜。
程序很簡單仿耽,就是按住按鈕,標(biāo)簽上的文本改成“Hello QT!”,然后松開按鈕各薇,標(biāo)簽上的文本改成“Goodbye!”??? 具體實(shí)現(xiàn)如下:
看到這里是不是對槽函數(shù)有了具體的認(rèn)識?關(guān)于如何發(fā)送信號就以后遇到的時候再講把峭判,相信看到這里已經(jīng)可以簡單的應(yīng)用信號和槽了开缎。
4.常見錯誤(本人)
在QT中,關(guān)于信號和槽林螃,本人經(jīng)常不小心遇到一些問題奕删,就簡單介紹一下:
(1)在對象還不存在的時候絕對不能用他來做信號與槽的連接!A迫稀M瓴小F鲋汀!;倒帧1慈蟆!铝宵!舉個例子:
QObject::connect(ui->pushButton,&QPushButton::cliked,ui->label,&QLabel::clear);
如果我的pushButton這個對象現(xiàn)在還沒有存在的時候打掘,千萬不能在主窗口的構(gòu)造函數(shù)中去做這個連接,不然你會發(fā)現(xiàn)你的程序就GG了鹏秋,所以防止這個錯誤最好的辦法就是尊蚁,什么時候要使用這個連接就什么時候去寫他,不要一股腦的在主窗口的構(gòu)造函數(shù)中去做完全部的連接侣夷。
(2)參數(shù)對應(yīng):崤蟆!0偻亍琴锭!
由于QT信號和槽函數(shù)的翻譯是由一個叫做Moc的預(yù)處理器(前面提到過)來完成的,所以關(guān)于信號和槽參數(shù)的匹配就很重要衙传,信號中出現(xiàn)的參數(shù)决帖,槽函數(shù)中必須要有,即使是你不需要使用這個參數(shù)蓖捶,但是你還是需要寫進(jìn)去地回,不然Moc就無法比配信號與槽,也就無法連接了俊鱼。具體例子沒有刻像,但是我相信以后你一旦使用到含有參數(shù)的信號一定會遇到這個問題,所以在使用類自帶的參數(shù)的時候最好先看清楚這個信號帶上信號并闲。
???????????????????????????????????????????????????????????????????????????????????????????????????????? ? ?? By? ASA