Qt 事件過濾器

來源:互聯網
上載者:User
      從QObject繼承的函數可以調用installEventFilter函數來安裝一個過濾器。

      所謂安裝一個過濾器就是指:調用installEventFilter的對象安裝一個過濾器,所有到達自己的訊息要先經過過濾器對象的處理,當過濾器對象處理後才能判定是否繼續給自己或者讓過濾器對象處理。

      舉例如下(拿qt文檔上標準的例子來講解下比較方便):

 

 MainWindow重載了基類的eventFilter(QObject *obj, QEvent *event)函數,說明MainWindow是一個過濾器,他要調用了installEventFilter(MainWindow*)的對象的訊息,如上的textEdit->installEventFilter(this);這句話就是說textEdit安裝了一個過濾器MainWindow,發送給textEdit的訊息會先經過MainWindow的過濾處理。因為eventFilter在處理髮送的訊息的時候第一個參數代表被查看的對象,第二個參數event代表了訊息的類型(必要的時候重載QEvent,攜帶豐富的附加資訊),所以過濾器可以處理所有自己需要的資訊,前提是過濾器安裝在其他對象上喲!

    上面只是說了基本原理,下面說下自己實際應用過程中常用的比較有效方法。

 

    方法一:(基本應用)

    原理:多個對象註冊到同一個對象上代碼如下(和上面的代碼差不多,多添加了幾個對象而已)

 class MainWindow : public QMainWindow { public:     MainWindow(); protected:     bool eventFilter(QObject *obj, QEvent *ev); private:     QTextEdit *textEdit;
QPushButtton * button;
QCheckBox * box; }; MainWindow::MainWindow() {

QHBoxLayout * layout = new QHBoxLayout(this);
textEdit = new QTextEdit;
button= new QPushButton;
box = new QCheckBox;
layout.addWidget(textEdit);
layout.addWidget(button); layout.addWidget(box);
#setCentralWidget(textEdit);

#安裝過濾器了
textEdit->installEventFilter(this);
button->installEventFilter(this);
box->installEventFilter(this); }
#過濾器處理觀察的對象的事件
bool MainWindow::eventFilter(QObject *obj, QEvent *event) { if (obj == textEdit) { if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); qDebug() << "Ate key press" << keyEvent->key(); return true; } else { return false; } }
else if(obj == button)
{
#處理一些需要處理的有關button的事件
}
else if(obj == box)
{
#處理一些需要處理的有關box的事件
}
else { // pass the event on to the parent class return QMainWindow::eventFilter(obj, event); } }

方法二:(反向使用)

原理:一個對象安裝多個過濾器,多個過濾器可以同時過濾此對象的訊息,根據不同的訊息類型來進行不同的處理
優缺點:可以誇多個庫實現訊息的相應,從而避免了通過訊號槽方式逐級傳遞。
缺點:需要定義多個處理事件類別,如下的event1和event2,每個事件基本都要定義獨立的類。
DemoInstaller * install = new DemoInstaller; 
class Event1:public QEvent
{
public:
Event1();
int data1;
int data2;
}

Event1::Event1()
:QEvent(Type(QEvent::User+10))
{
}

calss Event2:public QEvent
{
public:
int data3;
int data4;
}

Event2::Event2()
:QEvent(Type(QEvent::User+11))
{
}



class DemoFilter1: public QObject { public: DemoFilter1(); protected: bool eventFilter(QObject *obj, QEvent *ev); };

DemoFilter1::DemoFilter1()
{
install->installEventFillter(this);

}

bool DemoFilter1::eventFilter(QObject *obj, QEvent *ev)
{
if(obj==install)
{

if(ev.type()==QEvent::User+10)
{
Event1 * e1 = dynamic_cast<Event1*>(ev);
#處理e1.date1;
}
}
}

class DemoFilter2: public QObject { public: DemoFilter2(); protected: bool eventFilter(QObject *obj, QEvent *ev); };DemoFilter2::DemoFilter2()
{
install->installEventFillter(this);

}

bool DemoFilter2::eventFilter(QObject *obj, QEvent *ev)
{
if(obj==install)
{

if(ev.type()==QEvent::User+11)
{
Event2 * e2 = dynamic_cast<Event2*>(ev);
#處理e2.date3;
}
}
}


class DemoInstaller: public QObject { public: DemoInstaller(); };

本人也是接觸qt不久,如果大家還有好的使用方法的話,或者有關qt的技術內容,歡迎大家和我進行交流,QQ:634648088

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.