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

QLabelコントロールをmywidgetに追加し、MyLabelにアップグレードします。
インターフェイスにチェックボックスを追加し、背景を緑に設定しますレイアウト後の背景色の範囲は大きくなりますが、テキスト領域ボタンをクリックするだけで応答します。テキストと背景色は応答しません。応答では、クリック応答はイベントフィルターを介して実現されます。
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