posts - 74,comments - 5,views - 46778

    事件过滤器功能使得一个QObject对象可以监视另一个QObject对象中的事件,通过在一个QObject对象中安装事件过滤器,可以在事件到达该对象前捕获事件,从而起到监视该对象的作用。

    例如,实现按下按钮时,按钮上的文字为“Key Down”,松开按钮时,按钮上的文字为“Key Up”,创建一个QMainWindow窗口

1. mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class QPushButton;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    bool eventFilter(QObject* watched, QEvent* event);

private:
    Ui::MainWindow *ui;

    QPushButton* m_button;
};

#endif // MAINWINDOW_H

2. mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QMouseEvent>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_button = new QPushButton("Key Up", this);
    m_button->installEventFilter(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == m_button)
    {
        if(event->type() == QEvent::MouseButtonPress)  //鼠标按下
        {
            QMouseEvent* mouseEvent = (QMouseEvent*)event;
            if(mouseEvent->buttons() & Qt::LeftButton)  //左键按下
            {
                m_button->setText("Left Key Down");
            }
            else if(mouseEvent->buttons() & Qt::MidButton)
            {
                m_button->setText("Middle Key Down");
            }
            else if(mouseEvent->buttons() & Qt::RightButton)
            {
                m_button->setText("Right Key Down");
            }
        }
        else if(event->type() == QEvent::MouseButtonRelease)  //鼠标释放
        {
            m_button->setText("Key Up");
        }
    }

    //将事件交给上层对话框
    return QObject::eventFilter(watched, event);
}

 

posted on   不再低调  阅读(191)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示