qt事件学习

QT中事件的概念:

           事件是系统或qt本身在不同时刻发出的。如点击鼠标,按下键盘,窗口重绘。一些事件是在对用户操作做出响应时发出,如键盘事件。另一些事件是系统自动发出,如计时器事件

 

QT中事件和信号槽的区别:

     signal是由具体对象发出,然后会马上交给connect连接的slot进行处理,而对于事件,qt使用一个事件队列对所发生的事件进行维护,新事件会加到队列的尾部。但是必要的时候,事件也可以不进入队列而直接处理,并且事件还可以使用事件过滤器来进行过滤。总的来说,我们使用组件,关注的是信号槽,使用自定义组件,我们关心的是事件,可以通过事件来改变组件的默认操作。如我们要自定义一个QPushButton,就需要重写其鼠标点击事件和键盘处理事件,并在恰当的时候发出clicked()信号

 

查看帮助文档QEvent,

   QT的事件循环过程:QT main event loop 从 event queue 中获得窗口系统事件,把它们翻译成QEvents,然后把这些translated events 发给QObjects。一般而言,事件来自基本窗口事件,但也可以通过QCoreApplication::sendEvent()或QCoreApplication::postEvent()手动发送事件。

   QObjects是通过QObject::Event()函数来接受事件的。这个函数可以被子类执行来自定义事件处理和添加另外的事件类型。如QWidget::Event()。默认情况下,事件被分派到事件处理,如QObject::TimerEvent(),QWidget::MouseMoveEvent().QObject::installEventFilter()允许对象来拦截到另一个对象的事件

   基本的QEvents只包含一种事件类型参数和一个“accept”标志,accept标志可以通过accept()来设置,ignore()来清除。如果它被设置为默认情况,子类可以选择在constructor中来清除它,而不用ignore()

  子类的QEvent包含额外的参数来描述特殊的事件。

  

   这里涉及到了QApplication的exec()函数,查看帮助文档,可以明白其功能:进入主事件循环,等待exit()调用(exit()的函数:

void QCoreApplication::exit ( int returnCode = 0 )   [static],用一个return code告诉应用程序退出。具体看帮助文档。)。QApplication的了解:包含主事件循环(所有来自窗口系统的事件和其它源的存储和分发),应用程序的初始化和最终化,任务管理。使用Qt的任何Gui application,只有一个QApplication对象,对于非Qt Gui application,使用QCoreApplication代替,因为它不使用QtGui

Library。

 

 QT学习之路21:

 

           QKeyEvent *keyEvent = static_cast<QKeyEvent *>(Event)

这里涉及一个static_cast的用法:

 

用法:static_cast < type-id > ( expression )

  该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:

  ①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换

  进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;

  进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。

  ②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。

  ③把空指针转换成目标类型的空指针。

  ④把任何类型的表达式转换成void类型。

  注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。

  C++中static_cast和reinterpret_cast的区别

  C++primer第五章里写了编译器隐式执行任何类型转换都可由static_cast显示完成;reinterpret_cast通常为操作数的位模式提供较低层的重新解释

 

 

     event()的返回值主要是通知QApplication的nogify()函数是否处理下一事件,而accept()或ignore()用于不同事件处理器之间的沟通,如判断某一事件是否处理

     关于事件过滤器,QObject::eventFilter(QObject *watched,QEvent *event)

在使用之前,应调用QObject::installEventFilter(QObject *filterObj)

     安装了多个过滤器的组件,最后安装的一个事件过滤器会最先调用,类似堆栈行为。

 

     如果在事件过滤器中delete了接受组件,务必将其设置为true.否则QT还会把事件分发给这个接受组件,导致程序崩溃。

    事件的调用最终都会QCoreApplication的notify()函数,最大的控制权实际上是重写QCoreApplication的notify()函数。由此可以看出,qt的事件处理实际上可以分成5个层次:重定义事件处理函数,重定义event(),为单个组件安装事件过滤器,为QApplication安装事件过滤器,重定义QCoreApplication的notify()函数

  

你可能感兴趣的:(qt事件学习)