本文主要总结在Qt5.9中的鼠标事件,该事件包括鼠标进入控件事件、鼠标离开控件事件、控件内摁下鼠标事件、控件内释放鼠标事件。
实现鼠标进入、离开、摁下、释放控件的事件,只需要改写事件过滤虚函数eventFilter()就可以实现。
具体的步骤如下所述:
a1.首先注册目标控件,也就是将目标控件加入事件过滤器,用一个函数即可搞定:QPushbutton::installEventFilter(QObject *filterObj);
a2.然后重写虚函数事件过滤虚函数bool eventFilter(QObject *watched, QEvent *event),注意重写后,最后一定要添加一句返回值return QWidget::eventFilter(watched, event),否则注册的控件显示不出来;
a3.在事件过滤器虚函数内,用watched变量判断是否监控到控件(即watched==button);
a4.监控到控件后,用变量event判断当前鼠标事件是哪种事件,然后做对应的操作,做完后返回true;
比如是进入控件事件(event->type() == QEvent::Enter);
比如是离开控件事件(event->type() == QEvent::Leave);
比如是控件内摁下鼠标事件(event->type() == QEvent::MouseButtonPress);
比如是控件内释放鼠标事件(event->type() == QEvent::MouseButtonRelease);
a5.最后操作执行完后,一定要在末尾添加这条返回语句return QWidget::eventFilter(watched, event),否则注册的控件显示不出来。
具体的代码如下:
1.1新建一个widget工程,不要勾选ui界面。然后分别在widget.h,widget.cpp,main.cpp分别添加如下代码。
widget.h
#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QPushButton>#include <QEvent>#include <QMouseEvent>class Widget : public QWidget{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();protected:bool eventFilter(QObject *watched, QEvent *event);private:void setupUI();QPushButton *button;};#endif // WIDGET_H
widget.cpp
#include "widget.h"#include <QVBoxLayout>#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent){//窗口UI界面初始化setupUI();}Widget::~Widget(){ }bool Widget::eventFilter(QObject *watched, QEvent *event){if(watched == button){if(event->type() == QEvent::Enter){/*鼠标进入按钮事件*/qDebug()<<tr("监控到按钮事件,鼠标进入按钮事件");return true;}else if(event->type() == QEvent::Leave){/*鼠标离开按钮事件*/qDebug()<<tr("监控到按钮事件,鼠标离开按钮事件");return true;}else if(event->type() == QEvent::MouseButtonPress){/*鼠标摁下按钮事件*/qDebug()<<tr("监控到按钮事件,鼠标摁下按钮事件");return true;}else if(event->type() == QEvent::MouseButtonRelease){/*鼠标释放按钮事件*/qDebug()<<tr("监控到按钮事件,鼠标释放按钮事件");return true;}}return QWidget::eventFilter(watched, event);}void Widget::setupUI(){/*注册按钮事件,也即是将按钮加入事件过滤器*/button = new QPushButton("button");button->installEventFilter(this);QVBoxLayout *mainLayout = new QVBoxLayout();mainLayout->addWidget(button);mainLayout->addStretch();this->setLayout(mainLayout);}
main.cpp
#include "widget.h"#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);Widget w;w.resize(960,640);w.setWindowTitle(QString::fromUtf8("鼠标事件:进入控件事件、离开控件事件、控件内摁下鼠标事件、控件内释放鼠标事件"));w.show();return a.exec();}
1.2程序构建和运行后,结果如下图所示:
参考内容:
/zhenyu5211314/article/details/25599085(参考:鼠标进入控件和离开控件事件)
/xiezhongyuan07/article/details/80676047(参考:重写虚函数后,不显示按钮问题,需要返回上层)
/yu275184637/article/details/22865015(参考:鼠标进入控件内摁下和释放事件)
Qt5.9的鼠标事件:鼠标进入控件事件 鼠标离开控件事件 鼠标摁下控件事件 鼠标释放控件事件