Qt5.9的鼠标事件:鼠标进入控件事件、鼠标离开控件事件、鼠标摁下控件事件、鼠标释放控件事件

本文主要总结在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_OBJECT

public:
    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程序构建和运行后,结果如下图所示:

 

 

 

参考内容:

https://blog.csdn.net/zhenyu5211314/article/details/25599085(参考:鼠标进入控件和离开控件事件)

https://blog.csdn.net/xiezhongyuan07/article/details/80676047(参考:重写虚函数后,不显示按钮问题,需要返回上层)

https://blog.csdn.net/yu275184637/article/details/22865015(参考:鼠标进入控件内摁下和释放事件)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

三公子Tjq

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

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

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

打赏作者

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

抵扣说明:

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

余额充值