1. 程式人生 > >QT學習記錄3(事件過濾器)

QT學習記錄3(事件過濾器)

 最近在做專案,學到了不少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 

 滑鼠從標籤上邊移動的效果,截圖沒截好,圖中滑鼠不在標籤上。。。

 點選標籤的效果:

 這是事件過濾器最簡單的一個小例子,事實上,可以通過事件過濾器非常方便的實現一些功能,如嵌入式環境下呼叫軟鍵盤,以及防止介面掩蓋等。建議和我一樣的新手小夥伴看了這篇部落格後,去看下其他人的事件過濾器相關部落格,應該會收益良多,謝謝