マウスクリックイベント、マウスリリースイベント、およびマウス移動イベントをオーバーライドします。イベントフィルターは、単一のコントロールのイベント処理を実装します。
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);
}