有時候, 物件需要檢視、 甚至要攔截傳送到另外物件的事件。 例如, 對話方塊可能
想要攔截按鍵事件, 不讓別的元件接收到; 或者要修改回車鍵的預設處理。
我們已經知道,qt 建立了 qevent 事件物件之後, 會呼叫 qobject的 event()函式處理事件的分發。 顯然, 我們可以在 event()函式中實現攔截的操作。
由於 event()函式是 protected 的, 因此, 需要繼承已有類。 如果元件很多, 就需
要重寫很多個 event()函式。 這當然相當麻煩, 更不用說重寫 event()函式還得小心
一堆問題。 好在 qt 提供了另外一種機制來達到這一目的:事件過濾器
。
1. 事件過濾器
qobject 有乙個 eventfilter()函式, 用於建立事件過濾器。 函式原型如下
virtual
bool qobject::eventfilter ( qobject * watched, qevent * event )
;
這個函式正如其名字顯示的那樣, 是乙個「事件過濾器」。所謂事件過濾器, 可以
理解成一種過濾**
。事件過濾器會檢查接收到的事件。 如果這個事件是我們感興趣的型別, 就進行我們自己的處理; 如果不是, 就繼續**。 這個函式返回乙個 bool 型別, 如果你想將引數 event 過濾出來, 比如, 不想讓它繼續**, 就返回 true, 否則返回 false。事件過濾器的呼叫時間是目標物件(也就是引數裡面的 watched 物件) 接收到事件物件之前。 也就是說, 如果你在事件過濾器中停止了某個事件, 那麼, watched 物件以及以後所有的事件過濾器根本不會知道這麼乙個事件。
我們來看一段簡單的**:
class
mainwindow
:public qmainwindow
;mainwindow::
mainwindow()
bool mainwindow::
eventfilter
(qobject *obj, qevent *event)
else
}else
}
void qobject::installeventfilter ( qobject * filterobj )
bool customwidget::
event
(qevent *e)
}return qwidget::
event
(e);
}
現在, 我們可以給出乙個使用事件過濾器的版本:
bool filterobject::
eventfilter
(qobject *object, qevent *event)
else
}return
false
;}
常見的窗體是各種方形的對話方塊,但有時候也需要非方形的窗體,如圓形,橢圓甚至是不規則形狀的對話方塊。
實現步驟:
//新建乙個 pixmap 物件
qpixmap pixmap;
//載入
pixmap.
load
(":/new/prefix1/image/sunny.png");
//固定視窗大小, 將視窗大小設定為大小
setfixedsize
( pixmap.
width()
, pixmap.
height()
);//給視窗去掉邊框, 設定視窗的 flags
setwindowflags
(qt::framelesswindowhint |
windowflags()
);//設定透明背景
setattribute
(qt::wa_translucentbackground)
;
void sharewidget::
mousepressevent
(qmouseevent *ev)
if(ev-
>
button()
== qt::rightbutton)
}void sharewidget::
mousemoveevent
(qmouseevent *ev)
}void sharewidget::
paintevent
(qpaintevent *ev)
事件過濾器
2009 11 22 12 21 40 標籤 c 學習教程 qt教程qt 原始出處 作者資訊和本宣告。否則將追究法律責任。qt建立了qevent事件物件之後,會呼叫qobject的event 函式做事件的分發。有時候,你可能需要在呼叫event 函式之前做一些另外的操作,比如,對話方塊上某些元件可能...
事件過濾器
正常情況下,被qwidget看成是去移動 鍵盤焦點,但少數視窗部件需要自行解釋。讓我們試著設想已經有了乙個customerinfodialog的小部件。customerinfodialog 包含一系列qlineedit.現在,我們想用空格鍵來代替tab,使焦點在這些qlineedit間切換。乙個解決...
事件過濾器
6.1哪個控制項需求過濾事件 就給哪個控制項安裝過濾器 6.2步驟1 安裝過濾器 ui label t installeventfilter this 6.4 步驟2 6.4.1 重寫事件 給ui label做事件過濾器攔截 步驟1 給控制項安裝過濾器 通過父視窗給label安裝過濾器 ui lab...