使用事件过滤器实现点击操作
参考:QT对Label控件实现鼠标的单击和右击事件处理_qt鼠标右键点击事件_是小峰呀的博客-CSDN博客
程序的目录结构
UI设计结构
为了使控件更明显,右击空间选择样式表,把下面代码粘上去
border-width:2px;
border-style:solid;
border-color:rgb(0,127,127);
下面是代码部分,
先是h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDebug>
#include <QEvent>
#include <QMouseEvent>
#include <QLabel>
#include <QTimer>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
bool enable_in;
signals:
void sendObject(QObject *t);
private slots:
bool eventFilter(QObject *watched, QEvent *event);
void onTimeout();
private:
Ui::Widget *ui;
QTimer *timer = new QTimer();
};
#endif // WIDGET_H
然后是c文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui->label->installEventFilter(this);
ui->button->installEventFilter(this);
ui->widget->installEventFilter(this);
enable_in=1;
}
Widget::~Widget()
{
delete ui;
}
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
if(event->type() == QEvent::MouseButtonPress && enable_in==1)
{
enable_in=0;
timer->start();
timer->setInterval(50);
connect(timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
static int num=0;
qDebug()<<num;
num+=1;
if(watched == ui->label)
{
if(event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *e = static_cast<QMouseEvent *>(event);
if(e->button() == Qt::LeftButton)
{
qDebug()<<"label单击";
}
else if(e->button()==Qt::RightButton)
{
qDebug()<<"label右击";
}
emit sendObject(ui->label);
}
}
else if(watched == ui->button)
{
if(event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *e = static_cast<QMouseEvent *>(event);
if(e->button() == Qt::LeftButton)
{
qDebug()<<"button单击";
}
if(e->button()==Qt::RightButton)
{
qDebug()<<"button右击";
}
emit sendObject(ui->button);
}
}
else if(watched == ui->widget )
{
if(event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *q = static_cast<QMouseEvent *>(event);
if(q->button() == Qt::LeftButton)
{
qDebug()<<"widget单击";
}
if(q->button()==Qt::RightButton)
{
qDebug()<<"widget右击";
}
emit sendObject(ui->widget);
}
}
}
}
void Widget::onTimeout()
{
enable_in=1;
}
最后是main.c
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
程序运行效果如下
相比原博客的增加内容
1:将label和button置于widget里面,对这三者的分别处理。
2:经过测试,只要鼠标移动就会进入eventFilter,鼠标点击也会进入这个函数,但是我出于方便打印输出的缘故,加入了一个判断是否有鼠标点击。
3:在未加定时器功能时,经过测试,点击label会进入两次eventFilter,第一次输出“label点击“,第二次输出“widget点击”。所以定时器的作用是第一次进入eventFilter时,关闭进入eventFilter的enable_in,50ms后enable_in=1,才可再次进入。目前不知道为什么会进两次。