image.png

    1. bool MyLabel::event(QEvent *e)
    2. {
    3. QMouseEvent *ev = static_cast<QMouseEvent*>(e);
    4. if(e->type()==QEvent::MouseButtonPress) // 只有鼠标按下自己处理
    5. {
    6. QString str = QString("Event:鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
    7. qDebug() << str;
    8. return true; // 返回值 是 true代表用户自己处理
    9. }
    10. // 其它事件,让父类做默认处理
    11. return QLabel::event(e); // 返回值为false代表让系统处理,最好是让父类去处理
    12. }
    1. // widget.h
    2. class Widget : public QWidget
    3. {
    4. Q_OBJECT
    5. public:
    6. Widget(QWidget *parent = nullptr);
    7. ~Widget();
    8. private:
    9. Ui::Widget *ui;
    10. // 定时器事件
    11. void timerEvent(QTimerEvent*);
    12. // 定时器ID
    13. int id1;
    14. int id2;
    15. // step2:重写事件过滤器
    16. bool eventFilter(QObject*,QEvent*);
    17. };
    1. // widget.cpp step1:给ui->label安装事件过滤器
    2. Widget::Widget(QWidget *parent)
    3. : QWidget(parent)
    4. , ui(new Ui::Widget)
    5. {
    6. ui->setupUi(this);
    7. // 启动定时器 法一
    8. id1 = startTimer(1000);
    9. id2 = startTimer(2000);
    10. // 启动定时器 法二
    11. QTimer* timer1 = new QTimer(this);
    12. timer1->start(500); // 每隔0.5秒发送信号
    13. connect(timer1,&QTimer::timeout,[=](){
    14. static int num = 0;
    15. ui->label_4->setText(QString::number(num++));
    16. });
    17. // 点击按钮 暂停定时器
    18. connect(ui->pushButton,&QPushButton::clicked,[=](){
    19. timer1->stop();
    20. });
    21. // 给ui->label安装事件过滤器
    22. ui->label->installEventFilter(this); // step1:安装过滤器
    23. }
    24. // widget.cpp step2:重写事件过滤器
    25. bool Widget::eventFilter(QObject *obj, QEvent *e)
    26. {
    27. if(obj == ui->label)
    28. {
    29. if(e->type() == QEvent::MouseButtonPress)
    30. {
    31. QMouseEvent* ev = static_cast<QMouseEvent*>(e);
    32. QString str = QString("Event Filter:鼠标按下了,x=%1,y=%2").arg(ev->x()).arg(ev->y());
    33. qDebug() << str;
    34. return true; // 返回值 是 true代表用户自己处理
    35. }
    36. }
    37. return QWidget::eventFilter(obj,e);
    38. }