事件
事件(event)是由系統或者 Qt 本身在不同的時刻發出的。
一些事件在對用戶操作做出響應時發出,如鍵盤事件等;另一些事件則是由系統自動發出,如計時器事件。
Qt 程序需要在main()函數創建一個QApplication對象,然后調用它的exec()函數。這個函數就是開始 Qt 的事件循環。在執行exec()函數之后,程序將進入事件循環來監聽應用程序的事件。當事件發生時,Qt 將創建一個事件對象。Qt 中所有事件類都繼承于QEvent。在事件對象創建完畢后,Qt 將這個事件對象傳遞給QObject的event()函數。event()函數并不直接處理事件,而是按照事件對象的類型分派給特定的事件處理函數(event handler)
?protected? virtual 類 子函數實現
keyPressEvent()
keyReleaseEvent()
mouseDoubleClickEvent()
mouseMoveEvent()? ? ? ? ? ----setMouseTracking()
mousePressEvent()
mouseReleaseEvent() 等。
event()函數主要用于事件的分發,分發給不同的事件處理器(event handler)。
e->type() == QEvent::KeyPress? 事件類別
keyEvent->key() == Qt::Key_Tab? 按鍵值
bool CustomTextEdit::event(QEvent*e)
{
?? if (e->type() == QEvent::KeyPress)
{
??????? QKeyEvent *keyEvent =static_cast(e);
?????? if (keyEvent->key() == Qt::Key_Tab)
{
??????????? qDebug() << "You presstab.";
??????????? return true;
?????? }
??? }
??? return false;
}
事件過濾器
virtual bool QObject::eventFilter ( QObject *watched, QEvent * event );
現在我們可以總結一下 Qt 的事件處理,實際上是有五個層次:
1、重寫paintEvent()、mousePressEvent()等事件處理函數。這是最普通、最簡單的形式,同時功能也最簡單。
1、重寫event()函數。event()函數是所有對象的事件入口,QObject和QWidget中的實現,默認是把事件傳遞給特定的事件處理函數。
1、在特定對象上面安裝事件過濾器。該過濾器僅過濾該對象接收到的事件。
1、在QCoreApplication::instance()上面安裝事件過濾器。該過濾器將過濾所有對象的所有事件,因此和notify()函數一樣強大,但是它更靈活,因為可以安裝多個過濾器。全局的事件過濾器可以看到 disabled 組件上面發出的鼠標事件。全局過濾器有一個問題:只能用在主線程。
1、重寫QCoreApplication::notify()函數。這是最強大的,和全局事件過濾器一樣提供完全控制,并且不受線程的限制。但是全局范圍內只能有一個被使用(因為QCoreApplication是單例的)。
class MyApplication : public QApplication
{
public:
? ? MyApplication(int & argc, char ** argv):QApplication(argc, argv){};
? ? virtual bool notify(QObject * obj, QEvent * event)
? ? {
? ? ? ? //qDebug()<<__PRETTY_FUNCTION__<<obj<<event;
? ? ? ? if(event->type() == QMouseEvent::MouseButtonPress)
? ? ? ? {
? ? ? ? ? ? qDebug()<<__PRETTY_FUNCTION__<<obj<<event;
? ? ? ? }
? ? ? ? return QApplication::notify(obj,event);
? ? }
};