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));
}
}