Qt事件研究

2021-05-27 05:39:26 字數 1859 閱讀 8258

qevent

void qobject::installeventfilter ( const qobject * obj )

事件過濾器就是接收所有被傳送到這個物件的事件的物件。這個過濾器可以停止事件或者把它再轉給這個物件。事件過濾器obj通過它的eventfilter()函式來接收事件。如果事件被過濾了(比如,停止了),eventfilter()函式必須返回真,否則它必須返回假。

如果有多個事件過濾器被安裝到同乙個物件上,最後乙個被安裝的事件過濾器將先被啟用。

例項:#include

class mywidget : public qwidget;

mywidget::mywidget( qwidget *parent, const char *name )

: qwidget( parent, name )

bool mywidget::eventfilter( qobject *o, qevent *e )

else

}例如,qaccel類使用這種技術來擷取快捷鍵被按下。

警告:如果在你的eventfilter()函式中你刪除了接收物件,請確認返回真。否則,qt會把這個事件轉給被刪除的物件並且程式也許會崩潰。

bool qobject::eventfilter ( qobject * watched, qevent * e ) [虛函式] 

如果這個物件已經被安裝為watched物件的乙個事件過濾器,就過濾事件。 

在這個函式你的重新實現中,如果你想過濾出e事件,比如,停止它的進一步處理,返回真,否則返回假。

警告:如果你在這個函式中刪除接收物件,請確認返回真。否則,qt會把這個事件轉給被刪除的物件並且程式也許會崩潰。

也可以參考installeventfilter()。

在qaccel、qscrollview和qspinbox中被重新實現。

eventfilter被執行的**

/*!/internal

activates all event filters for this object.

this function is normally called from qobject::event() or qwidget::event().*/

bool qobject::activate_filters( qevent *e )

obj = it.current();

}return false;    // don't do anything with it}

signal與event

emit的是乙個signal,不是乙個event,signal本質上是乙個callback,是synchronous;

所謂的event一般是通過postevents()是會進入程序主迴圈的queue中的,是asynchronous,但是event也可sendevent()(這種用法是synchronous)

signal的發出者是物件;event的發出者一般來說是視窗系統。

signals are useful when using a widget, whereas events are useful when implementing a widget. 即在實現乙個元件的時候用事件,

例如qbutton裡

void clicked()是乙個訊號,它通過keypressevent與keyreleaseevent()來實現。

responsive stay機制

Qt事件研究

qt事件的傳遞類似於冒泡,如果在乙個窗體內未設定該事件屬性為true,它會被冒上去,讓該窗體的parent處理,如果仍未被設定為true,它會一直往上冒,直到被處理或到達頂層,設定事件屬性方式,就是呼叫event accept 設定為true,不做處理即為event ignore 設定為false ...

Qt事件機制研究

下面我們來分析一下 qt是如何進行事件監聽的。首先當然是分析 的原始碼,下面是 exec 的實現 可見其直接呼叫了qeventloop 的exec 函式,再來看 qeventloop exec qeventloop exec 中呼叫了 qeventloop enterloop 方法,而進入 ente...

Qt事件系統研究

qt中的事件基本概念 事件是對各種應用程式需要知道的由應用程式內部或者外部產生的事情或者動作的統稱。qt中使用乙個物件來表示乙個事件,這個物件繼承自qevent類。事件和訊號並非同一概念,在qt中,任何qobject子類例項都可以接受和處理事件。qt事件處理過程中發生的傳遞類似於冒泡,如果在乙個窗體...