溫馨提示×

溫馨提示×

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

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

QT之消息處理(七)

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

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

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

向AI問一下細節

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

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女