日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt / Qt5 事件(event)机制详解

發布時間:2024/10/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)机制详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。