首先解釋幾個名詞
事件:
Qt中的事件,主要指用戶輸入事件,比如:點擊一個按鈕、選中復選框、按下回車等。
事件處理:
當事件發生時,程序做出的反應,比如:當點擊顯示按鈕時,程序彈出一個對話框,或產生其他相應。
信號和槽:
Qt中的事件處理機制叫做信號和槽 (signal & slot)
其理論模型為:
對象 a 中有一個信號signal:XXX(代表一個事件)
對象 b 中有一個槽slot:YYY(事件處理函數)
事先把它們連接起來, connect(a, XXX, b, YYY);
然后,當 a 中事件發生時,b中的處理函數就會被調用。
(每一種界面開發庫都有一個事件處理機制,并且,事件處理總是脫離C++語法之外)
一、實現事件處理的過程:
1、查文檔,找到相應事件產生的函數原型(或者說產生信號的函數signal)
2、聲明、定義一個信號處理函數(槽),參數形式應該和signal的參數形式一致
3、將信號和槽用connect函數關聯
前兩步的示例如下:
//.h文件 private slots: int OnShowClicked(bool checked); //.cpp文件 int XXX::OnShowClicked(bool checked) { retunr 0; }
接下來做一個練習:
設計如下界面,并實現當點擊按鈕后,觸發自己定義的事件,使下方的文本框顯示一行內容
實現代碼如下:
//.h class Test4_1a_11_29 : public QMainWindow { Q_OBJECT public: Test4_1a_11_29(QWidget *parent = Q_NULLPTR); private slots: int OnShowClicked(bool checked); private: Ui::Test4_1a_11_29Class ui; }; //.cpp Test4_1a_11_29::Test4_1a_11_29(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); connect(ui.btnShow, SIGNAL(clicked(bool)), this, SLOT(OnShowClicked(bool))); //connect的參數 : 對象QObject* A , A的信號(SIGNAL), 對象QObject* B , B的槽(SLOT) A為產生信號的對象, B為處理信號的對象 } int Test4_1a_11_29::OnShowClicked(bool checked) { ui.QPlainTextEdit1->setPlainText("change world"); return 0; }
二、connect的注意要點
響應函數(槽)要用slot關鍵字修飾
參數SIGNAL和SLOT函數都要大寫
clicked和SLOT函數中的參數,注意只有類型
通過返回值判斷connect()函數執行是否成功。
但我發現,只能用false判斷,而不論connect() == true 還是 true == connect()的形式都是無法通過的,而如果非要用true,則需要對connect的返回值進行一次強制轉換:
assert(true == (bool)connect(ui.btnShow, SIGNAL(clicked(bool)), this, SLOT(OnShowClicked(bool))));
原因待探查
尾巴:
檢查connect的返回值,如果出錯,可以用qDebug()函數打印調試信息,但用這種方法打印的提示信息只有在調試狀態下可見。
既然這樣,用assert()是不是更方便呢?
另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
標題名稱:【Qt學習筆記】4.事件處理-創新互聯
鏈接地址:http://www.hntjjpw.com/article34/ddiese.html
成都網站建設公司_創新互聯,為您提供自適應網站、網站策劃、云服務器、營銷型網站建設、ChatGPT、企業建站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯