[QT]給QApplication安裝事件過濾器 app.installEventFilter


Qt的事件處理有5種級別:
1.      重寫控件的事件處理函數:如重寫keyPressEvent(),mousePressEvent()和paintEvent(),這是最常用的事件處理方法,我們已經看到過很多這樣的例子了。
2.      重寫QObject::event(),在事件到達事件處理函數前處理它。在需要改變Tab鍵的慣用法時這樣做。也可以處理那些沒有特定事件處理函數的比較少見的事件類型(例如,QEvent::HoverEnter)。我們重寫event()時,必須要調用基類的event(),由基類處理我們不需要處理的那些情況。
3.      給單獨的QObject對象安裝事件過濾器:對象用installEventFilter()注冊后,所有目標對象的事件都首先到達監視對象的eventFilter()函數。如果一個對象有多個事件過濾器,過濾器按順序激活,先到達最近安裝的監視對象,最后到達最先安裝的監視對象。
4.      給QApplication對象安裝事件過濾器,如果qApp(唯一的QApplication對象)安裝了事件過濾器,程序中所有對象的每個事件在被送到任何其它事件過濾器之前都要送到eventFilter()函數中。這個方法在調試的時候非常有用,在處理禁止使能狀態的控件的鼠標事件時這個方法也很常用。
5.      繼承QApplication,重寫notify()。Qt調用QApplication::nofity()來發送事件。重寫這個函數是在其他事件過濾器接收事件前得到所有事件的唯一方法。通常事件過濾器是最有用的,因為在同一時間,可以有任意數量的事件過濾器,但是notify()函數只有一個。
 
  在百度上找了很多,只想屏蔽dialog的ESC,找到了 (一去丶二三里: QDialog之屏蔽Esc鍵 http://blog.csdn.net/liang19890820/article/details/50357323).
由於基礎薄弱,看了許久都不知道怎么處理,於是就找給 QApplication 上事件過濾器的辦法,但是百度了許久都沒有百度出來.於是在 qtcn (http://www.qtcn.org/) 中搜索帖子找到例子
(feixiangxtu [提問]如何為QApplication對象安裝事件過濾器: http://www.qtcn.org/bbs/read-htm-tid-43479.html ).
於是,這里記錄下 給QApplication對象安裝事件過濾器 的例子,以備后期使用.
 
例子:
myObject.h
//先寫一個類,命名為MyObeject 繼承與QObject
class myObject:public QObject
{
public:
    bool eventFilter (QObject *obj, QEvent *event) //重新實現此虛函數
    {
        if(event->type()==QEvent::KeyPress)
        {
            QKeyEvent *key=static_cast<QKeyEvent *>(event);//將QEvent類型轉變為子類QKeyEvent類型,才能使用子類的key()函數
            if(key->key()==Qt::Key_Escape)//如果按下的鍵是ESC
            {
                qDebug() << QString("按下了'%1'鍵").arg(key->key())<<"按下了 ESC 鍵";  //打印出消息,這里只是為了測試
                qDebug() << "全局屏蔽 ESC 按鍵"<< "file: qapplicationeventfilter.h";
                return true;
            }
        }
        return QObject::eventFilter(obj,event);
    }
};
myObject.h

 

main.c 

int main(int argc, char *argv[])
{    
    QApplication a(argc, argv);
    myObject *obj= new myObject;  
    a.installEventFilter(obj);
    MainWindow w;    w.show();
    return a.exec();
}
main.c

 

如果有人知道 (一去丶二三里: QDialog之屏蔽Esc鍵 http://blog.csdn.net/liang19890820/article/details/50357323).這個的處理方式,希望告知,謝謝.

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM