Qt事件处理器和事件过滤器实例

来源:互联网 发布:数据库范式详解 编辑:程序博客网 时间:2024/05/20 12:50

Qt事件处理器和事件过滤器实例

标签: qtbutton浏览器文档框架
4943人阅读 评论(0)收藏举报
本文章已收录于:
分类:
作者同类文章X

    目录(?)[+]

    1. 一事件处理器使用实例
    2. 二事件过滤器使用实例
            在上一篇中我们了解了Qt中事件处理的方式,也提到了最常用的就是使用事件处理器和事件过滤器这两种方法。在这一篇,我们就来看看事件处理器和事件过滤器是怎么使用的。

    一、事件处理器使用实例

           Qt中针对每一种常见的事件类型都提供了相应的事件处理器,我们如果想捕获某种类型的事件并进行自定义处理,那么只需要实现重写这些事件处理器就行,至于常见的时间类型和对应的事件处理器如下图:

            在我的程序中,我使用到了鼠标滚轮事件,主要实现的就效果就是大家比较熟悉的:用一个控件显示图片,当滚动鼠标滚轮的时候可以调整图片显示的大小。
            这里我要做的就是捕获该图片显示控件的鼠标滚轮事件,然后改写该控件的鼠标滚轮滚动事件处理器。
            首先我们来看看鼠标滚轮事件以及相应的事件处理器是啥,查看上面的图即可知道:

            在Qt帮助文档里面我们可以查看到如下语句“The event handler QWidget::wheelEvent() receives wheel events.”。也就是说最后事件处理器会调用wheelEvent()函数来处理该事件,因此我们需要的就是改写wheelEvent()这个函数。

    第一步:在头文件中申明该函数:


    第二步实现wheelEvent()函数(这里主要关注的是事件处理的框架,而不是具体的示例,因此不去过多讲解代码细节):

    [cpp] view plain copy
    print?
    1. <span style="font-size:16px;">void ImageWidget::wheelEvent(QWheelEvent *event)  
    2. {  
    3.     int numDegrees = event->delta();  
    4.     int num = numDegrees / 120;  
    5.     if(num < 0)  
    6.     {  
    7.         num = 0 - num;  
    8.     }  
    9.   
    10.     if (event->orientation() == Qt::Horizontal) {  
    11.   
    12.         //scrollHorizontally(numSteps);  
    13.         scale *= 1.25;  
    14.         resize(this->scale * this->size());  
    15.     } else {  
    16.         //scrollVertically(numSteps);  
    17.         if(numDegrees > 0)  
    18.         {  
    19.             //scale *= 0.75;  
    20.             resize(num * 0.75 * this->size());  
    21.         }  
    22.         else if(numDegrees < 0)  
    23.         {  
    24.             //scale *= 1.25;  
    25.             resize(num * 1.25 * this->size());  
    26.         }  
    27.     }  
    28.   
    29.     event->accept();  
    30. }</span>  

            到这里这个功能就实现了,大家看看上面的头文件就知道这里还实现了其它类型事件的处理,其实都是一样的思路,找到欲处理的事件类型,找到对应的事件处理器,重写事件处理器中处理事件的方法即可。

    二、事件过滤器使用实例

            Qt事件模型中一项非常强大的功能就是一个QObject实例可以监视另一个QObject实例中的事件,实现方法是在目标对象中安装事件过滤器。这里我们接着上面的实例进行,为上面的图片浏览器增加一个功能:在我的程序中设置了一个自动播放的按键,点击按键后,在图片显示部件中就会显示一系列图片,就像动画播放许多幅图片一样,当在上面点击鼠标左键时,就停止动画播放而是停留在当前播放的图片;当我再点击鼠标右键的时候,又恢复为动画播放模式。
            首先说一下主要的页面布局:我在一个QMainWindow中放置一个自定义的图片显示部件。对照上面的说明,我们很容易知道,实现该功能的方法就是在目标部件(自定义的图片显示部件)上注册事件过滤器,此时的事件过滤器就是我们所说的监视对象,完成这些步骤之后,当目标部件有事件产生后,首先会传递给监视对象(事件过滤器)进行处理而不是该事件对应的事件处理器。所以说我们可以截获事件进行处理。监视对象截获目标对象的事件后就会调用自己的eventFilter()函数处理这些事件。
    总结起来就两个步骤:

    第一:对目标对象调用installEventFilter()来注册监视对象(事件过滤器);
    第二:重写监视对象的eventFilter()函数处理目标对象的事件。

    我们就严格按照这两步走:
    首先使用installEventFilter()函数给目标对象注册事件监听器:

    [cpp] view plain copy
    print?
    1. <span style="font-size:16px;">//给图片显示部件注册事件过滤器  
    2. imageWidget->installEventFilter(this);</span>  

    然后就是重写监视对象eventFilter()函数:

    [cpp] view plain copy
    print?
    1. <span style="font-size:16px;">//图片显示部件时间过滤器处理  
    2. bool PMainWindow::eventFilter(QObject *target, QEvent *event)  
    3. {  
    4.     if(target == imageWidget)  
    5.     {  
    6.         qDebug("The imageWidget generate the event!");  
    7.         if(event->type() == QEvent::MouseButtonPress)  
    8.         {  
    9.             QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);  
    10.             if(mouseEvent->buttons() & Qt::LeftButton)  
    11.             {  
    12.                 qDebug("The Left Button Event!");  
    13.                 killTimer(timeId);  
    14.             }  
    15.             else if(mouseEvent->buttons() & Qt::RightButton)  
    16.             {  
    17.                 qDebug("The Right Button Event!");  
    18.   
    19.                 //clickNum++;  
    20.                 //again();  
    21.                 timeId = startTimer(3000);  
    22.             }  
    23.   
    24.             return true;  
    25.         }  
    26.     }  
    27.   
    28.     //其它部件产生的事件则交给基类处理  
    29.     return QMainWindow::eventFilter(target, event);  
    30. }</span>  

    1
    0
     
     

    我的同类文章

    http://blog.csdn.net
    • Qt中调用PolarSSL库(一)2014-06-13
    • Qt应用程序中设置字体2014-05-04
    • QDockWidget详解2013-06-11
    • Qt中的串口编程之一2013-05-26
    • Qt应用程序之Application Main Window详解2013-04-24
    • 解读QML之四2013-03-08
    • Qt中事件分发源代码剖析2014-05-04
    • Qt中实现启动画面2014-04-14
    • Qt中的串口编程之二2013-06-01
    • QAction系列详解2013-05-05
    • Qt UI Interfaces2013-04-20
    更多文章
    0 0
    原创粉丝点击