QT事件处理,重写鼠标事件,事件过滤器的使用

重写鼠标点击事件、鼠标释放事件、鼠标移动事件,事件过滤器实现对单个控件的事件处理。

重写QLabel类,重新实现鼠标事件
mylabel.h

#ifndef MYLABEL_H
#define MYLABEL_H
#include <QLabel>
class MyLabel : public QLabel
{
    
    
    Q_OBJECT
public:
    explicit MyLabel(QWidget *parent = nullptr);
protected:
    //鼠标点击事件
    void mousePressEvent(QMouseEvent *ev);
    //鼠标释放事件
    void mouseReleaseEvent(QMouseEvent *ev);
    //鼠标移动事件
    void mouseMoveEvent(QMouseEvent *ev);
};
#endif // MYLABEL_H

mylabel.cpp

#include "mylabel.h"
#include<QMouseEvent>
#include<QDebug>
#include<QEvent>
MyLabel::MyLabel(QWidget *parent) : QLabel(parent)
{
    
    
    //设置默认追踪鼠标
    this->setMouseTracking(true);
}
void MyLabel::mousePressEvent(QMouseEvent *ev)
{
    
    
    int i = ev->x();
    int j = ev->y();
    //判断鼠标按下
    if(ev->button() == Qt::LeftButton)
    {
    
    
        qDebug() << "left";
    }
    if(ev->button()==Qt::RightButton)
    {
    
    
        qDebug()<<"riget";
    }
    if(ev->button()==Qt::MidButton)
    {
    
    
        qDebug()<<"mid";
    }
    //显示鼠标坐标,居中、加粗
    QString text = QString("<center><h1>Mouse Pressed:(%1,%2)</h1></center>").arg(i).arg(j);
    this->setText(text);
}
void MyLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    
    
    QString text = QString("<center><h1>Mouse Release:(%1,%2)</h1></center>").arg(ev->x()).arg(ev->y());
    this->setText(text);
}
 void MyLabel::mouseMoveEvent(QMouseEvent *ev)
 {
    
    
     QString text = QString("<center><h1>Mouse Move:(%1,%2)</h1></center>").arg(ev->x()).arg(ev->y());
     this->setText(text);
 }

mywidget中添加QLabel控件,提升为MyLabel;
在界面里添加一个checkbox,背景设置为绿色,布局后背景色范围很大,但是只有点击文字区域按钮有响应,点击无文字有背景色的区域按钮不会响应,通过事件过滤器实现点击响应。
mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include"mylabel.h"
namespace Ui {
    
    
class MyWidget;
}
class MyWidget : public QWidget
{
    
    
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = nullptr);
    ~MyWidget();
private:
    Ui::MyWidget *ui;
public:
    bool eventFilter(QObject *watched, QEvent *event);//事件过滤器
};
#endif // MYWIDGET_H

mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"
//#include <QKeyEvent>
#include <QDebug>
MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    
    
    ui->setupUi(this);
    ui->checkBox->setStyleSheet("background-color :green");
    ui->checkBox->installEventFilter(this);//控件需要注册事件过滤器
}
MyWidget::~MyWidget()
{
    
    
    delete ui;
}
/**
 * @brief 事件过滤器
 * @param watched控件
 * @param event事件
 * @return
 */
bool MyWidget::eventFilter(QObject *watched, QEvent *event)
{
    
    
    if(watched == ui->checkBox)
    {
    
    
        qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<"checkBox Event "<<event->type();
        if(event->type() == QEvent::MouseButtonRelease)
        {
    
    
            QCheckBox *checkBox = static_cast<QCheckBox*>(watched);
            checkBox->setChecked(!checkBox->isChecked());
            return true;
        }
    }
    return QWidget::eventFilter(watched,event);
}

猜你喜欢

转载自blog.csdn.net/weixin_40355471/article/details/108605949