QT-事件

2020-03-12  本文已影响0人  人不知QAQ

事件

事件(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);

    }

};

上一篇 下一篇

猜你喜欢

热点阅读