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