• [QT]给QApplication安装事件过滤器 app.installEventFilter


    Qt的事件处理有5种级别:
    1.      重写控件的事件处理函数:如重写keyPressEvent(),mousePressEvent()和paintEvent(),这是最常用的事件处理方法,我们已经看到过很多这样的例子了。
    2.      重写QObject::event(),在事件到达事件处理函数前处理它。在需要改变Tab键的惯用法时这样做。也可以处理那些没有特定事件处理函数的比较少见的事件类型(例如,QEvent::HoverEnter)。我们重写event()时,必须要调用基类的event(),由基类处理我们不需要处理的那些情况。
    3.      给单独的QObject对象安装事件过滤器:对象用installEventFilter()注册后,所有目标对象的事件都首先到达监视对象的eventFilter()函数。如果一个对象有多个事件过滤器,过滤器按顺序激活,先到达最近安装的监视对象,最后到达最先安装的监视对象。
    4.      给QApplication对象安装事件过滤器,如果qApp(唯一的QApplication对象)安装了事件过滤器,程序中所有对象的每个事件在被送到任何其它事件过滤器之前都要送到eventFilter()函数中。这个方法在调试的时候非常有用,在处理禁止使能状态的控件的鼠标事件时这个方法也很常用。
    5.      继承QApplication,重写notify()。Qt调用QApplication::nofity()来发送事件。重写这个函数是在其他事件过滤器接收事件前得到所有事件的唯一方法。通常事件过滤器是最有用的,因为在同一时间,可以有任意数量的事件过滤器,但是notify()函数只有一个。
     
      在百度上找了很多,只想屏蔽dialog的ESC,找到了 (一去丶二三里: QDialog之屏蔽Esc键 http://blog.csdn.net/liang19890820/article/details/50357323).
    由于基础薄弱,看了许久都不知道怎么处理,于是就找给 QApplication 上事件过滤器的办法,但是百度了许久都没有百度出来.于是在 qtcn (http://www.qtcn.org/) 中搜索帖子找到例子
    (feixiangxtu [提问]如何为QApplication对象安装事件过滤器: http://www.qtcn.org/bbs/read-htm-tid-43479.html ).
    于是,这里记录下 给QApplication对象安装事件过滤器 的例子,以备后期使用.
     
    例子:
    myObject.h
    //先写一个类,命名为MyObeject 继承与QObject
    class myObject:public QObject
    {
    public:
        bool eventFilter (QObject *obj, QEvent *event) //重新实现此虚函数
        {
            if(event->type()==QEvent::KeyPress)
            {
                QKeyEvent *key=static_cast<QKeyEvent *>(event);//将QEvent类型转变为子类QKeyEvent类型,才能使用子类的key()函数
                if(key->key()==Qt::Key_Escape)//如果按下的键是ESC
                {
                    qDebug() << QString("按下了'%1'键").arg(key->key())<<"按下了 ESC 键";  //打印出消息,这里只是为了测试
                    qDebug() << "全局屏蔽 ESC 按键"<< "file: qapplicationeventfilter.h";
                    return true;
                }
            }
            return QObject::eventFilter(obj,event);
        }
    };
    myObject.h

    main.c 

    int main(int argc, char *argv[])
    {    
        QApplication a(argc, argv);
        myObject *obj= new myObject;  
        a.installEventFilter(obj);
        MainWindow w;    w.show();
        return a.exec();
    }
    main.c

    如果有人知道 (一去丶二三里: QDialog之屏蔽Esc键 http://blog.csdn.net/liang19890820/article/details/50357323).这个的处理方式,希望告知,谢谢.

     
     
    如果问题解决起来不妥或者有更好的解决办法,麻烦请告知,帮助曾经和你一样的入门者,谢谢。
  • 相关阅读:
    Git工具简介
    Windows10搭建开发环境----Maven工具安装
    SpringBoot----01.SpringBoot基本配置
    创建一个SpringBoot项目
    软件工程----02. 需求分析
    软件工程----01. 软件工程简介
    JavaSE----11.Java 内部类
    JavaSE----10.Java 面向对象
    JavaSE----09.Java 数组
    前端面试总结
  • 原文地址:https://www.cnblogs.com/ourran/p/6816986.html
Copyright © 2020-2023  润新知