Qt中关于eventFilter函数无法过滤QTableWidget鼠标事件的处理方式

关于eventFilter函数无法过滤QTableWidget鼠标事件的处理方式

问题描述

在一个QDialog中有一个QTableWidget,在dialog类中设置table的鼠标事件过滤,代码如下:

cpp 复制代码
Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::AddMultiplePointsDlg)
{
    ui->setupUi(this);
    ui->tableWidget->installEventFilter(this);
}

bool Dialog::eventFilter(QObject *object, QEvent *event)
{
    if(object == ui->tableWidget)
    {
        if(event->type() == QEvent::MouseButtonRelease)
        {
            // 其他功能代码
        }
    }

    return QDialog::eventFilter(object, event);
}

在上述代码中,我们想要的效果是,在table上点击鼠标时,程序能过滤到该事件,执行我们的代码。但在实际测试中发现,其他事件都能过滤的到,比如显示事件,键盘事件等。但唯独鼠标事件无法过滤,包括按下和释放时间都无法过滤

问题原因分析

QTableWidget、QTreeWidget等等这类控件,都继承自QAbstractScrollArea。而QAbstractScrollArea类的控件,并不只是本身的一个Wieget,内部还包含一个viewport。viewport也是一个widget,那些表格等item实际上是显示在viewport上的。也就是说,鼠标时间并没有传递给table,而是传递给了viewport。

解决方案

问题原因找到了,解决方法也很简单了,设置事件过滤不要设置table,而是要设置viewport,如果需要获取鼠标的位置,也要使用viewport的坐标,代码如下:

cpp 复制代码
Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::AddMultiplePointsDlg)
{
    ui->setupUi(this);
    ui->tableWidget->viewport()->installEventFilter(this);
}

bool Dialog::eventFilter(QObject *object, QEvent *event)
{
    if(object == ui->tableWidget->viewport())
    {
        if(event->type() == QEvent::MouseButtonRelease)
        {
            QMouseEvent *mouseEvent = dynamic_cast<QMouseEvent*>(event);
            if(mouseEvent)
            {
                QPoint pos = mouseEvent->pos();
                // 其他功能代码
            }
        }
    }

    return QDialog::eventFilter(object, event);
}
相关推荐
小短腿的代码世界1 天前
Qt Bluetooth源码深度解析:从HCI协议到跨平台API的完整架构
开发语言·qt·架构
小短腿的代码世界1 天前
Qt WebEngine多进程架构与IPC通信:从Chromium多进程到Qt信号槽融合
qt·架构·系统架构
尘中远1 天前
【Qwt 7.0 系列】快速入门与核心新特性概览 —— 更现代的 Qt 数据可视化库
qt·数据可视化·绘图·qwt·科学绘图
初阳7851 天前
【Qt】系统相关(3)——多线程
qt
初阳7851 天前
【Qt】系统相关(2)——文件
开发语言·qt
尘中远2 天前
【Qwt 7.0 系列】坐标轴与刻度系统 —— 刻度引擎、网格、图例与刻度朝内
qt·数据可视化·qcustomplot·qwt·工业软件·科学绘图
sycmancia2 天前
Qt——多线程间的互斥
开发语言·qt
尘中远2 天前
【Qwt 7.0 系列】常用图表类型实战 —— 柱状图、散点图、箱线图与直方图
qt·qwt·工业软件·科学绘图
尘中远2 天前
【Qwt 7.0 系列】交互功能详解 —— 平移、缩放、坐标轴交互与数据拾取
qt·数据可视化·绘图·qcustomplot·qwt·科学绘图
sycmancia2 天前
Qt——进程与线程的概念
qt