• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

QT事件处理(四)–QApplication中注册事件过滤器

Qt admin 3年前 (2016-05-12) 10097次浏览 6个评论 扫描二维码

Qt 处理事件的第四种方式:”在 QApplication 中注册事件过滤器”,如果一个事件过滤器被注册到程序中唯一的 QApplication 对象,应用程序中所有对象里的每一个事件都会在它们被送达其他事件事件过滤器之前,首先抵到这个 eventFilter()函数。

在这里继承一个 QWidget 用来注册 QApplication 事件过滤器,MyWidget 的头文件 mywidget.h 如下:

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QMouseEvent>

class MyWidget : public QWidget
{
public:
    MyWidget();
protected:
    bool eventFilter(QObject *obj, QEvent *e);
};

#endif

mywidget.cpp 文件如下:

#include "mywidget.h"

MyWidget::MyWidget()
{
}

bool MyWidget::eventFilter(QObject *obj, QEvent *e)
{
    //屏蔽 MouseButtonPress、MouseButtonRelease 和 MouseMove 事件
    if (e->type() == QEvent::MouseButtonPress || e->type() == QEvent::MouseButtonRelease || e->type() == QEvent::MouseMove)
    {
        return true;
    }
    return QWidget::eventFilter(obj, e);
}

在这里,我们把 button 称为目标对象,MainWindow 实现了 eventFilter()函数,用 MainWindow 来监视 button,称 MainWindow 为监视对象。

mainwindow.h 文件如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include <QPushButton>

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
protected:
    bool eventFilter(QObject *obj, QEvent *e);
private:
    QPushButton *button;
};

#endif

mainwindow.cpp 文件如下:

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    button = new QPushButton;
    this->setCentralWidget(button);
    button->installEventFilter(this); //为 button 设置过滤器
}

MainWindow::~MainWindow()
{
}

bool MainWindow::eventFilter(QObject *obj, QEvent *e)
{
    if (obj == button)         //响应 button 的 MouseButtonPress、MouseButtonRelease 和 MouseMove 事件
    {
        if (e->type() == QEvent::MouseButtonPress)
        {
            QMouseEvent *event = static_cast<QMouseEvent*> (e);
            button->setText(QString("Press: %1, %2").arg(QString::number(event->x()), QString::number(event->y())));
            return true;
        }
        else if (e->type() == QEvent::MouseButtonRelease)
        {
            QMouseEvent *event = static_cast<QMouseEvent*> (e);
            button->setText(QString("Release: %1, %2").arg(QString::number(event->x()), QString::number(event->y())));
            return true;
        }
        else if (e->type() == QEvent::MouseMove)
        {
            QMouseEvent *event = static_cast<QMouseEvent*> (e);
            button->setText(QString("Move: %1, %2").arg(QString::number(event->x()), QString::number(event->y())));
            return true;
        }
        else
        {
            return false;
        }
    }

    return QMainWindow::eventFilter(obj, e);
}

运行程序,可以发现 button 不管是点击、释放还是拖动鼠标,都不会显示任何文本。因为我们已经为 QApplication 注册了事件过滤器,事件在到达 button 的监视对象 MainWindow 之前,会先到达 QApplication 的事件过滤器 MyWidget 的事件处理函数 eventFilter()函数,该函数屏蔽了所有的 MouseButtonPress、MouseButtonRelease 和 MouseMove 事件。所以为 button 对象注册的事件过滤器不起作用。程序运行界面为:

 

2012101119584916


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明QT 事件处理(四)–QApplication 中注册事件过滤器
喜欢 (0)
admin
关于作者:

您必须 登录 才能发表评论!

(6)个小伙伴在吐槽
  1. Купить недорогие радиаторы отопления. Мы продаем инженерную сантехнику, в которой уверены. Наш магазин инженерной сантехники предлагает огромный ассортимент сантехнической продукции, по выгодным ценам. Подробности по ссылке...
    HaroldGah2019-03-19 18:30
  2. Great! this is want I am searching, thank you!! Lifepo4 battery pack suppliers
    Cathywty2019-03-25 13:41
  3. Доброй ночи! Даже очень вау какой сайт. Море приколов...Амф, Мефедрон, Гашишь, МДМА, и т.д. Жми на сайт: http://fasritaro.tk
    BobHaw2019-04-04 07:02
  4. 301 Moved Permanently https://blahblahtalksite.wordpress.com/ - More info...
  5. Jest naprawdę dużo zalet tej propozycji, które sprawiają, że po prostu opłaca się się nią zainteresować. Podstawą jest tutaj na pewno to, że z profesjonalną pomocą sprzedaż pojazdu może być zrealizowana w naprawdę krótkim czasie. Wybierając skup aut w nie trzeba użerać się z sprzątaniem pojazdu do sprzedaży, szykować ofert i wrzucać je w sieci, jak i marnować czasu na liczne kontakty z ewentualnymi nabywającymi. Następną zaletą będzie ogromne bezpieczeństwo sprzedaży. Wyłącznie tutaj można otrzymać gwarancję otrzymania całkowitej umowy kupna-sprzedaży na kwotę dokładnie taką, jaka została przedstawiona w naszej propozycji. Identycznie traktowane są osoby, które zainteresuje kasacja pojazdów w . W takim przypadku szykujemy stosowne potwierdzenia wzięcia samochodu wykorzystanego do kasacji, dzięki którym da się bez żadnego kłopotu samochód wyrejestrować w lokalnym urzędzie. Wreszcie skorzystanie z oferty naszej firmy to też możliwość uzyskania realnej wartości własnego auta. Nie trzeba schodzić z ceną do granic możliwości, by spieniężyć swój wóz a także pozyskać z niego pieniądze. Wyceny dokonujemy biorąc pod uwagę faktyczną cenę rynkową auta, jego stan techniczny, najechane kilometry i obecność różnych uszkodzeń. Do tego osoby wybierające złomowanie aut w mogą liczyć na bardzo konkurencyjne wyceny, które z pewnością spełnią wszystkie wymagania. Wystarczy jeden kontakt, by niezwykle dokładnie poznać wszystkie usługi. Profesjonalne wyceny do niczego zobowiązują oraz zawsze da się zrezygnować z oferty bez ponoszenia jakichkolwiek kosztów.