日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt学习笔记-----事件

發(fā)布時間:2024/4/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt学习笔记-----事件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

除了信號槽,Qt也使用了另一種手段來響應(yīng)對象,即事件。比如鼠標左鍵按下事件,鍵盤某一個按鍵按下事件。
Qt的主循環(huán)QCoreApplication::exec()就是一個事件循環(huán),這個循環(huán)捕獲本地計算機產(chǎn)生的各種事件然后將這些事件存放到事件隊列中,按照FIFO的順序?qū)⒚恳粋€事件傳遞給相應(yīng)的對象(QObject)。
事件隊列中的事件被傳遞給QObject::event()函數(shù),這個函數(shù)是一個集中分配營,它判斷參數(shù)是哪種類型的事件,然后將該事件傳遞給相應(yīng)的事件處理函數(shù)進行處理。而event本身并不對事件進行處理 。

事件的傳播順序:
1. 在QCoreApplication::exec()主循環(huán)中,Qt捕獲計算機產(chǎn)生的各種事件,如果在此之前還有其他事件沒有分配,就暫時將該事件放到事件隊列中,隨后再按照FIFO順序一個個傳播。
2. 事件經(jīng)過一系列傳播后到達該類的事件過濾器eventFilter(),這個函數(shù)對該事件進行過濾,如果返回true則傳播終止。返回false則告訴Qt不過濾這個事件,繼續(xù)傳播。
3. 如果沒有過濾掉,則隨后會傳播到該類的event()函數(shù)(或其父類),在這個函數(shù)中會根據(jù)事件的所屬類型進行分配,調(diào)用相應(yīng)的事件處理函數(shù)。如果不需要再向它的父類傳播這個事件,則返回true告訴Qt應(yīng)該處理完這個事件了。否則,調(diào)用父類的event函數(shù)來保證由父類來處理這個事件,防止其他類型的事件被忽略掉。
4. 特定的事件處理函數(shù)進行處理。

接下來我們逐個討論這幾個函數(shù):

eventFilter

bool QObject::eventFilter(QObject *watched, QEvent *event)

事件過濾函數(shù),會在event函數(shù)之前被調(diào)用。返回true則告訴Qt事件被過濾掉,反之繼續(xù)傳播給event函數(shù)。通常的實現(xiàn)形式為:

/*判斷對象指針watched是否是需要過濾掉事件的那個對象*/ /*通常和this比較或者和該類的某個成員變量比較*/ if(watched == this) //或 if(watched == m_watched) {/*判斷事件類型是否是需要過濾的事件*/if(event->type() == /*某個事件類型*/ ){return true;} } return false;

event

bool QObject::event(QEvent *e)

如果成功分配掉事件則返回true;否則,調(diào)用父類的event函數(shù)防止其他類型事件被忽略掉。通常的實現(xiàn)形式為:

if(e->type() == /*event 1*/) {doThings1();return true; } else if(e->type() == /*event 2*/) {doThings2();return true; } //...關(guān)心的幾個類型的事件分配 return QWidget::event(e); //調(diào)用父類的函數(shù)

然后就是特定的事件處理函數(shù),舉個例子,如果我們需要對鼠標點擊事件進行自定義的處理,那么我們就需要在自定義類中重新實現(xiàn)mousePressEvent()函數(shù)。又因為這個函數(shù)是父類的虛函數(shù),我們無需重新實現(xiàn)event()函數(shù),所以可以像這樣:

//.h#include <QWidget> #include <QLabel> class MyClass : public QWidget {Q_OBJECT public:MyClass(QWidget *parent = 0); protected:void mousePressEvent(QMouseEvent *event); private:QLabel *label; };//.cppMyClass::MyClass(QWidget *parent):QWidget(parent) {label = new QLabel();setCentralWidget(label); }void MyClass::mousePressEvent(QMouseEvent *event) {label->setText(QString("[%1, %2]").arg(event->x(), event->y())); }

總結(jié)

以上是生活随笔為你收集整理的Qt学习笔记-----事件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。