• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

Qt事件处理(二)–修改Event

Qt admin 2年前 (2016-05-12) 859次浏览 0个评论 扫描二维码

Qt 处理事件的第二种方式:”重新实现 QObject::event()函数”,通过重新实现 event()函数,可以在事件到达特定的事件处理器之前截获并处理他们。这种方法可以用来覆盖已定义事件的默认处理方式,也可以用来处理 Qt 中尚未定义特定事件处理器的事件。当重新实现 event()函数时,如果不进行事件处理,则需要调用基类的 event()函数。

mybutton.h 的文件如下:

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QPushButton>
#include <QMouseEvent>

class MyButton : public QPushButton
{

protected:
    bool event(QEvent *e);
    void mousePressEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
};

#endif

mybutton.cpp 文件如下:

#include "mybutton.h"

void MyButton::mousePressEvent(QMouseEvent *event)
{
    this->setText(QString("Press: %1, %2").arg(QString::number(event->x()), QString::number(event->y())));
}

void MyButton::mouseReleaseEvent(QMouseEvent *event)
{
    this->setText(QString("Release: %1, %2").arg(QString::number(event->x()), QString::number(event->y())));
}

void MyButton::mouseMoveEvent(QMouseEvent *event)
{
    this->setText(QString("Move: %1, %2").arg(QString::number(event->x()), QString::number(event->y())));
}

bool MyButton::event(QEvent *e)
{
    if (e->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent *event = static_cast<QMouseEvent*> (e);
        this->setText(QString("Press: %1, %2").arg(QString::number(event->x()), QString::number(event->y())));
        return true;
    }
    else if (e->type() == QEvent::MouseButtonRelease || e->type() == QEvent::MouseMove) //屏蔽 MouseButtonRelease 和 MouseMove 事件
    {
        return true;
    }

    return QPushButton::event(e); //其他事件调用基类的 event()函数进行处理
}

运行程序,可以发现 button 的文本不管是点击、释放还是拖动鼠标,都只显示鼠标按下的文本,因为我们在 event()函数里屏蔽了 MouseButtonRelease 和 MouseMove 事件。故事件是先经过 event()函数,然后在到达特定的事件处理函数,程序运行界面为:

2012101020214590


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Qt 事件处理(二)–修改 Event
喜欢 (0)
admin
关于作者:

您必须 登录 才能发表评论!