QT-事件

事件

事件(event)是由系统或者 Qt 本身在不同的时刻发出的。

一些事件在对用户操作做出响应时发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。

Qt 程序需要在main()函数创建一个QApplication对象,然后调用它的exec()函数。这个函数就是开始 Qt 的事件循环。在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)

 protected  virtual 类 子函数实现

keyPressEvent()

keyReleaseEvent()

mouseDoubleClickEvent()

mouseMoveEvent()          ----setMouseTracking()

mousePressEvent()

mouseReleaseEvent() 等。


event()函数主要用于事件的分发,分发给不同的事件处理器(event handler)

e->type() == QEvent::KeyPress  事件类别

keyEvent->key() == Qt::Key_Tab  按键值

bool CustomTextEdit::event(QEvent*e)

{

   if (e->type() == QEvent::KeyPress)

{

        QKeyEvent *keyEvent =static_cast(e);

       if (keyEvent->key() == Qt::Key_Tab)

{

            qDebug() << "You presstab.";

            return true;

       }

    }

    return false;

}


事件过滤器

virtual bool QObject::eventFilter ( QObject *watched, QEvent * event );


现在我们可以总结一下 Qt 的事件处理,实际上是有五个层次:

1、重写paintEvent()、mousePressEvent()等事件处理函数。这是最普通、最简单的形式,同时功能也最简单。

1、重写event()函数。event()函数是所有对象的事件入口,QObject和QWidget中的实现,默认是把事件传递给特定的事件处理函数。

1、在特定对象上面安装事件过滤器。该过滤器仅过滤该对象接收到的事件。

1、在QCoreApplication::instance()上面安装事件过滤器。该过滤器将过滤所有对象的所有事件,因此和notify()函数一样强大,但是它更灵活,因为可以安装多个过滤器。全局的事件过滤器可以看到 disabled 组件上面发出的鼠标事件。全局过滤器有一个问题:只能用在主线程。

1、重写QCoreApplication::notify()函数。这是最强大的,和全局事件过滤器一样提供完全控制,并且不受线程的限制。但是全局范围内只能有一个被使用(因为QCoreApplication是单例的)。

class MyApplication : public QApplication

{

public:

    MyApplication(int & argc, char ** argv):QApplication(argc, argv){};

    virtual bool notify(QObject * obj, QEvent * event)

    {

        //qDebug()<<__PRETTY_FUNCTION__<<obj<<event;

        if(event->type() == QMouseEvent::MouseButtonPress)

        {

            qDebug()<<__PRETTY_FUNCTION__<<obj<<event;

        }

        return QApplication::notify(obj,event);

    }

};

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 为什么在头文件中有的是使用前置声明,而有的是包含头文件? 如下代码: 前置声明(forward declarati...
    Joe_HUST阅读 1,317评论 0 6
  • Qt 的事件来自操作系统,Qt自己产生。当Qt应用程序运行时,qt有一个未处理的事件队列,每个事件处理周期内,将处...
    师照照阅读 181评论 0 0
  • 笔者用Qt算是用了挺长时间了,当初入C++的坑就是因为需要用Qt设计上位机软件。现在打算总结一下一些当初觉得有点深...
    饮茶先啦靓仔阅读 50,781评论 2 26
  • 《Qt 学习之路 2》原文地址 Qt跨平台策略 GUI 模拟:任何平台都提供了图形绘制函数,例如画点、画线、画面等...
    CharlesZhangCh阅读 2,049评论 0 5
  • 1、Qt中的事件 Qt中,事件作为一个对象,继承自QEvent类,常见的有键盘事件QKeyEvent、鼠标事件QM...
    xixiaxi阅读 544评论 0 1