QT學習記錄3(事件過濾器)
阿新 • • 發佈:2018-11-23
最近在做專案,學到了不少QT的內容,遇到問題的時候四找資料,但大部分部落格都講的比較全面,所以可能一上來不是那麼容易看懂。所以我更新的這些內容都是非常新手向的,先對事件過濾器有個大概的印象:
可以把事件過濾器認為是一張網,這張網可以由你選擇安裝什麼地方(按鈕,編輯框,標籤,窗體。。。隨心所欲),當你把這張網放好之後,你的滑鼠,鍵盤等對相應的控制元件進行操作的時候,都會先經過這張網,所以你就可以在這張網上面進行一些判斷,來決定你要做什麼
下邊的例子是:窗體上邊放了一個標籤(label),當滑鼠從標籤上邊移動的時候,顯示座標(相對座標),當滑鼠單擊標籤的時候,彈出一個對話方塊
程式碼:
標頭檔案:
//Widget.h標頭檔案 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QEvent> #include <QMessageBox> #include <QDebug> #include <QMouseEvent> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); protected: bool eventFilter(QObject *, QEvent *); //事件過濾器 private: Ui::Widget *ui; }; #endif // WIDGET_H
.cpp檔案
//widegt.cpp #include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); ui->label->installEventFilter(this); /*為標籤安裝過濾器*/ } Widget::~Widget() { delete ui; } bool Widget::eventFilter(QObject *obj, QEvent *ev) { if(obj == ui->label && ev->type() == QEvent::MouseMove) /*滑鼠進入標籤*/ { QMouseEvent *m = (QMouseEvent*)ev; /*這2行是為了顯示出滑鼠位置*/ qDebug() << "x,y:" << m->x() << "," << m->y(); } else if(obj == ui->label && ev->type() ==QEvent::MouseButtonPress) /*滑鼠點選標籤*/ { QMessageBox::information(this, "提示", "標籤被點選"); } return QWidget::eventFilter(obj, ev); }
簡單畫了個介面, 中間是一個label
滑鼠從標籤上邊移動的效果,截圖沒截好,圖中滑鼠不在標籤上。。。
點選標籤的效果:
這是事件過濾器最簡單的一個小例子,事實上,可以通過事件過濾器非常方便的實現一些功能,如嵌入式環境下呼叫軟鍵盤,以及防止介面掩蓋等。建議和我一樣的新手小夥伴看了這篇部落格後,去看下其他人的事件過濾器相關部落格,應該會收益良多,謝謝