Qt / Qt5 事件(event)机制详解
生活随笔
收集整理的這篇文章主要介紹了
Qt / Qt5 事件(event)机制详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、簡述
事件主要分為兩種:
- 在與用戶交互時發生。比如按下鼠標(mousePressEvent),敲擊鍵盤(keyPressEvent)等。
- 系統自動發生,比如計時器事件(timerEvent)等。
在發生事件時(比如說上面說的按下鼠標),就會產生一個?QEvent?對象(這里是QMouseEvent,為?QEvent?的子類),這個?QEvent?對象會按照下圖所示的流程進行傳遞:
源碼部分如下:
二、事件過濾器
?本質上是其他對象插入到當前對象中的間諜,該間諜專門捕獲傳入到當前對象的 QEvent 對象,發現該 QEvent 符合該間諜的任務要求,則進行處理,申請直接截獲該 QEvent 對象,不給當前對象使用。
?主對話框攔截向?TextEdit 輸入的字符。
#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTextEdit>class Widget : public QWidget { public:Widget();protected:virtual bool eventFilter(QObject *obj, QEvent *event) override;private:QTextEdit *textEdit; };#endif // WIDGET_H #include "widget.h" #include "ui_widget.h"#include <QDebug> #include <QKeyEvent> #include <iostream>Widget::Widget() {textEdit = new QTextEdit(this);textEdit->setGeometry(30, 30, 300, 30);textEdit->installEventFilter(this);move(30, 30); }bool Widget::eventFilter(QObject *obj, QEvent *event) {if (obj == textEdit){if (event->type() == QEvent::KeyPress){QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);std::cout << "iostream you press " << keyEvent->key() << std::endl;//事件不再進行傳播,攔截return true;}elsereturn false; //繼續傳播}else{//當不確定是否繼續傳播時,按照父類的方法來處理//即調用父類的evenFilter函數return QWidget::eventFilter(obj, event);} }??三、事件分發器
?函數原型:
virtual bool event(QEvent *e)返回 true,表明該事件本函數已經處理完了,不用勞煩老爹處理了。
返回 false,表明該事件關我 PI 事,還是交給老爹處理吧。?
如果想要老爹處理需要溝通一下,語言如下:
return QWidget::event(e);老爹的操作就是將該事件根據類型的不同分配到不同是事件分發器中。
四、事件處理
不同的事件對象有不同的處理函數,例如鼠標抬起事件,其專用處理函數為:
virtual void mousePressEvent(QEvent *);?五、小結
(SAW:Game Over!)
?
總結
以上是生活随笔為你收集整理的Qt / Qt5 事件(event)机制详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt / 定时器
- 下一篇: Macbook 中如何通过命令行打开 v