QT-事件

事件

事件(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);

? ? }

};

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • 為什么在頭文件中有的是使用前置聲明,而有的是包含頭文件? 如下代碼: 前置聲明(forward declarati...
    Joe_HUST閱讀 1,310評論 0 6
  • Qt 的事件來自操作系統,Qt自己產生。當Qt應用程序運行時,qt有一個未處理的事件隊列,每個事件處理周期內,將處...
    師照照閱讀 181評論 0 0
  • 筆者用Qt算是用了挺長時間了,當初入C++的坑就是因為需要用Qt設計上位機軟件。現在打算總結一下一些當初覺得有點深...
    飲茶先啦靚仔閱讀 50,716評論 2 26
  • 《Qt 學習之路 2》原文地址 Qt跨平臺策略 GUI 模擬:任何平臺都提供了圖形繪制函數,例如畫點、畫線、畫面等...
    CharlesZhangCh閱讀 2,033評論 0 5
  • 1、Qt中的事件 Qt中,事件作為一個對象,繼承自QEvent類,常見的有鍵盤事件QKeyEvent、鼠標事件QM...
    xixiaxi閱讀 532評論 0 1