?? eventsandfilters.html
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- /home/reggie/tmp/qt-3.0-reggie-5401/qt-x11-commercial-3.0.5/doc/object.doc:386 -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="Translator" content="Blueneno">
<meta name="Qt zh_CN Documents Website" content="http://www.qiliang.net/qt">
<title>事件和事件過濾器</title>
<style type="text/css"><!--
h3.fn,span.fn { margin-left: 1cm; text-indent: -1cm; }
a:link { color: #004faf; text-decoration: none }
a:visited { color: #672967; text-decoration: none }
body { background: #ffffff; color: black; font-family: "Times New Roman" }
--></style>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr bgcolor="#E5E5E5">
<td valign=center>
<a href="index.html">
<font color="#004faf">主頁</font></a>
| <a href="classes.html">
<font color="#004faf">所有的類</font></a>
| <a href="mainclasses.html">
<font color="#004faf">主要的類</font></a>
| <a href="annotated.html">
<font color="#004faf">注釋的類</font></a>
| <a href="groups.html">
<font color="#004faf">分組的類</font></a>
| <a href="functions.html">
<font color="#004faf">函數</font></a>
</td>
<td align="right" valign="center"><img src="logo32.png" align="right" width="64" height="32" border="0"></td></tr></table>
<h1 align=center>事件和事件過濾器</h1>
<p> 在Qt里,一個事件是繼承自<a href="qevent.html">QEvent</a>的對象。事件通過調用<A href="qobject.html#event">QObject::event</A>(),被發送到繼承自 <a href="qobject.html">QObject</a> 的對象。事件發送就是一個事件已經產生,由 <a href="qevent.html">QEvent</a>正好去表達,且<a href="qobject.html">QObject</a> 需要去回應。多數事件針對 <a href="qwidget.html">QWidget</a>和他的子類的,此外還有些不和圖形相關的重要事件,比如,套接字激活,——某種被用于<a href="qsocketnotifier.html">QSocketNotifier</a>運作的事件。
<p> 某些事件來自窗口系統,如<a href="qmouseevent.html">QMouseEvent</a>,某些來自其他源頭,如<a href="qtimerevent.html">QTimerEvent</a>,而某些來自應用程序。Qt一視同仁,因此像通常一樣,你可以準確地發送事件,這和Qt自己的事件循環所作的方式一樣。
<p> 多數事件類型具有特定的類,最常見的<a href="qresizeevent.html">QResizeEvent</a>、<a href="qpaintevent.html">QPaintEvent</a>、<a href="qmouseevent.html">QMouseEvent</a>、<a href="qkeyevent.html">QKeyEvent</a>和<a href="qcloseevent.html">QCloseEvent</a>。有很多別的,差不多40種左右,但大都是相當零碎。
<p> 每個類派生自<a href="qevent.html">QEvent</a>且添加事件特定的函數;例如,<a href="qresizeevent.html">QResizeEvent</a>。在<a href="qresizeevent.html">QResizeEvent</a>中,就被加入了<a href="qresizeevent.html#size">QResizeEvent::size</a>()和<a href="qresizeevent.html#oldSize">QResizeEvent::oldSize</a>()。
<p> 某些類支持多種事件類型。<a href="qmouseevent.html">QMouseEvent</a>支持鼠標移動、按壓、粘滯按壓、拖拽、點擊、右按壓,等等。
<p> 因為程序需要在多變且復雜的方式下作用,Qt的事件派發機制就是靈活的。<a href="qapplication.html#notify">QApplication::notify</a>() 的文檔扼要地敘述其整個來龍去脈,我們揭示在這里的內容滿足99%的應用。
<p> 對于事件去被派發的正常的辦法是調用一個虛擬函數。如,<a href="qpaintevent.html">QPaintEvent</a>通過調用<a href="qwidget.html#paintEvent">QWidget::paintEvent</a>()被使用。這個虛擬函數負責引起適當的響應,一般是重畫窗口部件。
<p> 有時,并不存在一個特定事件函數,或者特定事件功能不足。最普通的例如按下tab鍵。正常情況下,被<a href="qwidget.html">QWidget</a>看成是去移動 <a href="focus.html#keyboard-focus">鍵盤焦點</a>,但少數窗口部件 需要自行解釋。
<p> 這些對象能重新實現<a href="qobject.html#event">QObject::event</a>(),按常規事件處理,以及要么在通常的處理之前,或之后處理,或完全重寫。一個與眾不同的的窗口部件,它解釋了tab,也含有一個該應用特定的可能包含的自定制事件:
<p> <pre>
bool MyClass:event( <a href="qevent.html">QEvent</a> * e ) {
if ( e-><a href="qevent.html#type">type</a>() == QEvent::KeyPress ) {
<a href="qkeyevent.html">QKeyEvent</a> * ke = (QKeyEvent*) e;
if ( ke-><a href="qkeyevent.html#key">key</a>() == Key_Tab ) {
// 這里是特定的tab處理
k->accept();
return TRUE;
}
} else if ( e-><a href="qevent.html#type">type</a>() >= QEvent::User ) {
<a href="qcustomevent.html">QCustomEvent</a> * c = (QCustomEvent*) e;
// 這里是自定義事件處理
return TRUE;
}
QWidget::<a href="qwidget.html#event">event</a>( e );
}
</pre>
<p> 更一般的,一個對象需要去考慮其它的事件。Qt用<a href="qobject.html#installEventFilter">QObject::installEventFilter</a>()支持這個目的(相應的有移除)。如,對話框通常要為某些窗口部件去過濾按鍵,比如,去修改Return鍵的處理。
<p> 一個事件過濾器在目標對象處理之前得以去處理事件。過濾器的<a href="qobject.html#eventFilter">QObject::eventFilter</a>()實現被調用,它可以接受或丟棄過濾,也可容許或拒絕進一步去處理事件。如果所有的事件過濾器允許進一步的處理事件,事件自己就被送達目標對象。如果它們之一停止處理,目標和任何后面的事件過濾器根本就對該事件一無所知了。
<p> 整個應用程序中過濾所有的事件也是可能的,通過在<a href="qapplication.html">QApplication</a>上安裝一個事件過濾器。這里有<a href="qtooltip.html">QToolTip</a>為了處理全部鼠標和鍵盤行為的實作。這個功能相當強大,但其在整個應用中也拖慢了每單個事件的派送,因此最好避免這種應用方式。
<p> 全局事件過濾器在對象特定的過濾器前被調用。
<p> 許多應用程序都要創建和發送他們自己的事件。
<p> 創建一種內置類型的事件是非常簡單的:創建一個相應的類型的對象,然后調用<a href="qapplication.html#sendEvent">QApplication::sendEvent</a>()或者<a href="qapplication.html#postEvent">QApplication::postEvent</a>()。
<p> sendEvent() 立即處理事件——當sendEvent() 返回,(事件過濾器和)對象已經處理過事件了。對于很多事件類,調用isAccepted()函數,他告知你該事件能否被目前調用的處理者所接受或者拒絕。
<p> postEvent()投送事件于一個隊列,以使能延遲派發。在下次Qt的主事件循環運行,他派發全部事件,帶有些優化。舉例,若有數個resize事件,它們就被壓縮到一個。對于paint事件同樣如此:<a href="qwidget.html#update">QWidget::update</a>()調用 postEvent(),最小化閃屏和避免多次重畫,以增加速度。
<p> postEvent()在對象初始化期間常常被使用,因為在對象完成初始化后,投送的消息會被很快派發。
<p> 去創建一個自定義類型的事件,你需要定義一個事件號,其必須大于<a href="qevent.html#Type-enum">QEvent::User</a>,可能你也需要從<a href="qcustomevent.html">QCustomEvent</a>去派生,為了傳遞有關你的自定義事件的特性。看<a href="qcustomevent.html">QCustomEvent</a>的文檔了解細節。
<p>
<!-- eof -->
<p><address><hr><div align=center>
<table width=100% cellspacing=0 border=0><tr>
<td>Copyright © 2002
<a href="http://www.trolltech.com">Trolltech</a>
<td><a href="http://www.trolltech.com/trademarks.html">Trademarks</a>
<td><a href="zh_CN.html">譯者:Blueneno</a>
<td align=right><div align=right>Qt 3.0.5版</div>
</table></div></address></body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -