首先解釋幾個(gè)名詞
創(chuàng)新互聯(lián)企業(yè)建站,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),專注于網(wǎng)站建設(shè)技術(shù),精于網(wǎng)頁(yè)設(shè)計(jì),有多年建站和網(wǎng)站代運(yùn)營(yíng)經(jīng)驗(yàn),設(shè)計(jì)師為客戶打造網(wǎng)絡(luò)企業(yè)風(fēng)格,提供周到的建站售前咨詢和貼心的售后服務(wù)。對(duì)于做網(wǎng)站、成都做網(wǎng)站中不同領(lǐng)域進(jìn)行深入了解和探索,創(chuàng)新互聯(lián)在網(wǎng)站建設(shè)中充分了解客戶行業(yè)的需求,以靈動(dòng)的思維在網(wǎng)頁(yè)中充分展現(xiàn),通過(guò)對(duì)客戶行業(yè)精準(zhǔn)市場(chǎng)調(diào)研,為客戶提供的解決方案。
事件:
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)用。
(每一種界面開(kāi)發(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)下可見(jiàn)。
既然這樣,用assert()是不是更方便呢?