溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

QT之消息處理(七)

發(fā)布時間:2020-07-28 12:05:07 來源:網(wǎng)絡 閱讀:1110 作者:上帝之子521 欄目:開發(fā)技術(shù)
那么我們之前學習了計算器的界面制作,但是只是實現(xiàn)了一個計算器的界面,還不具有計算器的功能。

接下來我們就要學習在QT中如何進行消息的處理,比如你按下1鍵之后,QT會如何處理這個信號。QT封裝了具體操作系統(tǒng)的消息機制,同時它遵循經(jīng)典的 GUI 消息驅(qū)動事件模型。
QT中定義了與系統(tǒng)消息相關(guān)的概念,接下來我們將介紹3個概念:
1、信號(signal):由操作系統(tǒng)產(chǎn)生的消息
2、槽(slot):程序中的消息處理函數(shù)
3、連接(connect):將系統(tǒng)消息綁定到消息處理的函數(shù)
QT中消息處理機制:
QT之消息處理(七)
信號到槽的連接必須發(fā)生在兩個 QT 類對象之間?。。?br/>Qt 的核心 -- QObject::connect函數(shù)
QT之消息處理(七)
Qt 中的 “新” 關(guān)鍵字:
1、SIGNAL :用于指定消息名
2、SLOT :用于指定消息修理函數(shù)名
3、Q_OBJECT:所有自定義槽的類必須在類聲明的開始處加上 Q_OBJECT
4、slots :用于在類中聲明消息處理函數(shù)
在介紹了這么多的概念之后,我們是不是想要試一下,這個具體是怎么進行操作的,接下來我們就要進行試驗,我們只需編寫一個簡單的示例源程序進行說明即可。
示例代碼:
#include <QApplication>
#include <QPushButton>

    int main(int argc, char *argv[])
       {
            QApplication a(argc, argv);
            QPushButton b;

            b.setText("Click me to quit");
            b.show();

            return a.exec();
    }

在構(gòu)建源碼之后,運行可執(zhí)行程序,得到如下界面:
QT之消息處理(七)
但是我們點擊 Click me to quit! 這個按鈕,卻發(fā)現(xiàn)窗口并沒有退出,這是為什么呢?相信聰明的大家已經(jīng)發(fā)現(xiàn),我們這個示例代碼沒有 connect 函數(shù),也就是說我們并沒有對它進行消息的連接處理,所以我們加上這句代碼
QObject::connect(&b, SIGNAL(clicked()), &a, SLOT(quit()));
再次運行后,發(fā)現(xiàn)窗口已經(jīng)完美退出。現(xiàn)在我們就已經(jīng)實現(xiàn)基本的一個消息處理了。大家可以自己實踐下。
接下來我們繼續(xù)回到我們的主線,也就是計算器的信號處理。我們上面示例代碼中調(diào)用的槽是 Qt 自帶的,那么我們的計算器想要的處理槽必須是自定義的,所以我們得自定義槽。那么自定義槽有什么要注意的呢?聽我給大家一一道來,ps開玩笑的啦。
有這么幾點需要注意:
1、只有 QObject 的子類才能自定義槽
2、定義槽的類必須在聲明的最開始處使用 Q_OBJECT
3、類中聲明槽時需要使用 slots 關(guān)鍵字
4、槽與所處理的信號在函數(shù)簽名上必須一致
5、SIGNAL 和 SLOT 所指的的名稱中:可以包含參數(shù)類型;不能包含具體的參數(shù)名
接下來我們繼續(xù)實現(xiàn)計算器的槽處理的代碼了。
我們在 QCalculatorUI.h 添加過后的代碼如下, 而在onButtonClicked 函數(shù)中實現(xiàn)的是打印這個函數(shù)名,最后實現(xiàn)的效果圖如下:
QT之消息處理(七)
現(xiàn)在已經(jīng)基本實現(xiàn)了自定義槽的效果,接下來我們就要實現(xiàn),按下什么鍵,就顯示出什么,思路是一樣的,直接在里面打印對應的名稱數(shù)組的名字。
QT之消息處理(七)
關(guān)于這塊有個經(jīng)典的問題:Object::connect:No such slot ...
解決方法如下:
1、檢查類是否繼承于 QObject
2、檢查類聲明的開始處是否添加 Q_OBJECT
3、檢查是否使用 slot 關(guān)鍵字進行槽聲明
4、檢查槽的名稱是否拼寫錯誤
5、重新執(zhí)行 qmake
那么博主在做這個實驗的時候,類聲明的開始處忘了添加 Q_OBJECT這個關(guān)鍵字了,導致這個問題出現(xiàn)了。希望大家不要跟博主犯同樣的錯誤了。好了,有關(guān)信號與槽相關(guān)的知識,我們就學習到這了。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI