—— 均为自学笔记,如有错误请指正
注: 上图是 bool event(QEvent * ev)
可以在事件分发做一个事件拦截 (通常不会这样做)
1. 事件分发器 拦截
- 声明 <X.h>
//通过event事件分发器 拦截 鼠标按下事件
bool event(QEvent * e);
- 定义 <X.cpp>
//通过event事件分发器 拦截 鼠标按下事件
bool myLabel::event(QEvent * e)
{
//如果是鼠标按下,在event事件分发中做拦截操作
if(e->type() == QEvent::MouseButtonPress)
{
//C++中的类型转换 将下面的父类转为子类
QMouseEvent * ev =static_cast<QMouseEvent *>(e);
QString str = QString("in Event Press: x=%1 y=%2 globalX=%3 globalX=%4 ").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str ;
return true; //true代表用户处理这个事件,不想下分发
}
//其他事件交给父类默认处理
return QLabel::event(e);
}
2. 事件过滤器 (了解)
- 声明
//重写事件过滤器的事件
bool eventFilter(QObject *,QEvent *);
- 定义实现
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//启动定时器
id1 = startTimer( 1000); //参数1:间隔,单位:ms
id2 = startTimer( 2000);//单位:ms
//定时器第二种方式
QTimer * timer = new QTimer(this);
//启动定时器
timer->start(500); //单位:ms
connect(timer,&QTimer::timeout,[=](){
//label_4每隔0.5秒 +1
static int num4 = 1 ;
ui->label_4->setText( QString::number(num4++));
});
//点击暂停按钮,实现停止定时器
connect(ui->btn,&QPushButton::clicked,[=](){
timer->stop();
});
//给label 1 安装事件过滤器
//步骤1 安装事件过滤器
ui->label->installEventFilter(this);
//步骤2 重写 eventfilter事件
}
//步骤2 重写 eventfilter事件
bool Widget::eventFilter(QObject * obj ,QEvent * e)
{
if(obj == ui->label)
{
if(e->type() == QEvent::MouseButtonPress)
{
QMouseEvent * ev =static_cast<QMouseEvent *>(e);
QString str = QString("in eventfilter Press: x=%1 y=%2 globalX=%3 globalX=%4 ").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug() << str ;
return true; //true代表用户处理这个事件,不想下分发
}
}
//其他默认处理
return QWidget::eventFilter(obj,e);
}