WIdget事件

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    WidgetEvent *e = new WidgetEvent(this);
    e->addWidget(this);
    e->setMouseTracking(this,true);
    connect(e,&WidgetEvent::mouseMoveEvent,this,[=](QWidget *widget, QMouseEvent *event){
            qDebug()<<event->pos();
            return true;
    });
}

 

 

#ifndef WIDGETEVENT_H
#define WIDGETEVENT_H

#include <QWidget>

class WidgetEvent : public QObject
{
    Q_OBJECT
public:
    explicit WidgetEvent(QObject *parent);
    void addWidget(QWidget*widget);
    void removeWidget(QWidget*widget);
    void setMouseTracking(QWidget *widget, bool enable);

signals:
    bool actionEvent(QWidget *widget, QActionEvent *event);
    bool changeEvent(QWidget *widget, QEvent *event);
    bool closeEvent(QWidget *widget, QCloseEvent *event);
    bool contextMenuEvent(QWidget *widget, QContextMenuEvent *event);
    bool dragEnterEvent(QWidget *widget, QDragEnterEvent *event);
    bool dragLeaveEvent(QWidget *widget, QDragLeaveEvent *event);
    bool dragMoveEvent(QWidget *widget, QDragMoveEvent *event);
    bool dropEvent(QWidget *widget,QDropEvent *evnet);
    bool enterEvent(QWidget *widget,QEvent *event);
    bool focusInEvent(QWidget *widget,QFocusEvent *event);
    bool focusOutEvent(QWidget *widget,QFocusEvent *event);
    bool hideEvent(QWidget *widget,QHideEvent *event);
    bool inputMethodEvent(QWidget *widget,QInputMethodEvent *event);
    bool keyPressEvent(QWidget *widget, QKeyEvent *event);
    bool keyReleaseEvent(QWidget *widget, QKeyEvent *event);
    bool leaveEvent(QWidget *widget,QEvent *event);
    bool mouseMoveEvent(QWidget *widget, QMouseEvent *event);
    bool mousePressEvent(QWidget *widget, QMouseEvent *event);
    bool mouseReleaseEvent(QWidget *widget, QMouseEvent *event);
    bool mouseDoubleClickEvent(QWidget *widget, QMouseEvent *event);
    bool moveEvent(QWidget *widget, QMoveEvent *event);
    bool paintEvent(QWidget *widget, QPaintEvent *event);
    bool resizeEvent(QWidget *widget, QResizeEvent *event);
    bool showEvent(QWidget *widget,QShowEvent *event);
    bool tabletMoveEvent(QWidget *widget,QTabletEvent *event);
    bool tabletPressEvent(QWidget *widget,QTabletEvent *event);
    bool tabletReleaseEvent(QWidget *widget,QTabletEvent *event);
    bool wheelEvent(QWidget *widget,QWheelEvent *event);


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

#endif // WIDGETEVENT_H

#include "widgetevent.h"

#include <QMouseEvent>
#include<QKeyEvent>
#include <QtDebug>
#include <QMainWindow>

WidgetEvent::WidgetEvent(QObject *parent) : QObject(parent)
{
}

void WidgetEvent::addWidget(QWidget *widget)
{
    widget->installEventFilter(this);
}

void WidgetEvent::removeWidget(QWidget *widget)
{
    widget->removeEventFilter(this);
}

void WidgetEvent::setMouseTracking(QWidget *widget, bool enable)
{
    if(dynamic_cast<QMainWindow*>(widget)!=nullptr)
    {
        // QMainWindow needs to set the Central Widget MouseTracking to true first
        static_cast<QMainWindow*>(widget)->centralWidget()->setMouseTracking(enable);
    }
    widget->setMouseTracking(enable);
}

bool WidgetEvent::eventFilter(QObject *watched, QEvent *event)
{
    switch(event->type()){

    case QEvent::ActionAdded:
    case QEvent::ActionRemoved:
    case QEvent::ActionChanged:
        return  emit actionEvent(static_cast<QWidget*>(watched),static_cast<QActionEvent*>(event));

    case QEvent::ToolBarChange:
    case QEvent::ActivationChange:
    case QEvent::EnabledChange:
    case QEvent::FontChange:
    case QEvent::StyleChange:
    case QEvent::PaletteChange:
    case QEvent::WindowTitleChange:
    case QEvent::IconTextChange:
    case QEvent::ModifiedChange:
    case QEvent::MouseTrackingChange:
    case QEvent::ParentChange:
    case QEvent::WindowStateChange:
    case QEvent::LanguageChange:
    case QEvent::LocaleChange:
    case QEvent::LayoutDirectionChange:
    case QEvent::ReadOnlyChange:
        return  emit changeEvent(static_cast<QWidget*>(watched),event);

    case QEvent::Close:
        return emit closeEvent(static_cast<QWidget*>(watched),static_cast<QCloseEvent*>(event));

    case QEvent::ContextMenu:
        return emit contextMenuEvent(static_cast<QWidget*>(watched),static_cast<QContextMenuEvent*>(event));

    case QEvent::DragEnter:
        return emit dragEnterEvent(static_cast<QWidget*>(watched),static_cast<QDragEnterEvent*>(event));

    case QEvent::DragLeave:
        return  emit dragLeaveEvent(static_cast<QWidget*>(watched),static_cast<QDragLeaveEvent*>(event));

    case QEvent::DragMove:
        return  emit dragMoveEvent(static_cast<QWidget*>(watched),static_cast<QDragMoveEvent*>(event));

    case QEvent::Drop:
        return emit dropEvent(static_cast<QWidget*>(watched),static_cast<QDropEvent*>(event));

    case QEvent::Enter:
        return emit enterEvent(static_cast<QWidget*>(watched),event);

    case QEvent::FocusIn:
        return emit focusInEvent(static_cast<QWidget*>(watched), static_cast<QFocusEvent*>(event));

    case QEvent::FocusOut:
        return  emit focusOutEvent(static_cast<QWidget*>(watched), static_cast<QFocusEvent*>(event));

    case QEvent::Hide:
        return emit hideEvent(static_cast<QWidget*>(watched), static_cast<QHideEvent*>(event));

    case QEvent::InputMethod:
        return emit inputMethodEvent(static_cast<QWidget*>(watched), static_cast<QInputMethodEvent*>(event));

    case QEvent::KeyPress:
        return  emit keyPressEvent(static_cast<QWidget*>(watched),static_cast<QKeyEvent*>(event));

    case QEvent::KeyRelease:
        return  emit keyReleaseEvent(static_cast<QWidget*>(watched),static_cast<QKeyEvent*>(event));

    case QEvent::Leave:
        return  emit leaveEvent(static_cast<QWidget*>(watched),event);

    case QEvent::MouseMove:
        return  emit mouseMoveEvent(static_cast<QWidget*>(watched),static_cast<QMouseEvent*>(event));

    case QEvent::MouseButtonPress:
        return  emit mousePressEvent(static_cast<QWidget*>(watched),static_cast<QMouseEvent*>(event));

    case QEvent::MouseButtonRelease:
        return  emit mouseReleaseEvent(static_cast<QWidget*>(watched),static_cast<QMouseEvent*>(event));

    case QEvent::MouseButtonDblClick:
        return  emit mouseDoubleClickEvent(static_cast<QWidget*>(watched),static_cast<QMouseEvent*>(event));

    case QEvent::Move:
        return  emit moveEvent(static_cast<QWidget*>(watched),static_cast<QMoveEvent*>(event));

    case QEvent::Paint:
        return emit paintEvent(static_cast<QWidget*>(watched),static_cast<QPaintEvent*>(event));

    case QEvent::Resize:
        return   emit resizeEvent(static_cast<QWidget*>(watched),static_cast<QResizeEvent*>(event));

    case QEvent::Show:
        return   emit showEvent(static_cast<QWidget*>(watched),static_cast<QShowEvent*>(event));

    case QEvent::TabletMove:
        return   emit tabletMoveEvent(static_cast<QWidget*>(watched),static_cast<QTabletEvent*>(event));

    case QEvent::TabletPress:
        return   emit tabletPressEvent(static_cast<QWidget*>(watched),static_cast<QTabletEvent*>(event));

    case QEvent::TabletRelease:
        return   emit tabletReleaseEvent(static_cast<QWidget*>(watched),static_cast<QTabletEvent*>(event));

    case QEvent::Wheel:
        return   emit wheelEvent(static_cast<QWidget*>(watched),static_cast<QWheelEvent*>(event));

    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼游戏开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值