QT中QTableWidget鼠标事件捕获

Posted 小哈龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT中QTableWidget鼠标事件捕获相关的知识,希望对你有一定的参考价值。

 一.tableWidget 常用事件捕捉方法

用 Qt 的 eventFilter() 和 Object 的 installEventFilter() 来实现。

首先,要定义你的 eventFilter(),这是用来处理相应事件的函数

MyGui::eventFilter( QObject *object, QEvent *event )

具体例子可以从Qt的帮助里面看。

我的用法是:

if (object == tableWidget->viewport())

    if( event->type() == QEvent::MouseButtonPress)
     
        // if yes, we need to cast the event into a QMouseEvent type
        QMouseEvent * pMouseEvent = static_cast<QMouseEvent *>(event);
        // check whether it's mid button pressed
        if (pMouseEvent->button() == Qt::MidButton)
        
            //do the processing and return true
            textBrowserErrorInfo->setText(tr("clicked"));
            return true;   //一定要返回true,如果你不想别的object也能接收到这个event
        
    

    //检测鼠标在tableWidget控件内移动则必须开启鼠标捕获功能:tableWidget->setMouseTrack(true)
    if( event->type() == QEvent::MouseMove)
     
        // if yes, we need to cast the event into a QMouseEvent type
        QMouseEvent * pMouseEvent = static_cast<QMouseEvent *>(event);
        
        //获取鼠标移动所在点,所在的行
        QTableWidgetItem *pItem=tableWidget->itemAt(mouse->pos());
        int row=pItem->row();
        int column=pItem->column();
        return true;   //一定要返回true,如果你不想别的object也能接收到这个event
    



// 注意这里,未处理的事件,要返还给上一级的事件处理函数。

return QWidget::eventFilter(object, event);

关键问题,是要 install 这个 EventFilter。在你的 Widget 的构造函数里面,

myTableWidget->viewport()->installEventFilter(this);

这个用法,就是告诉Qt,QTableWidget 的 viewport() 要处理所有 MyGui 的事件。

这个 viewport() 就是重点。你不可以像帮助中那样,直接用

myTableWidget->installEventFilter(this);

这样的话,你的 QTableWidget 将不会接收到 MousePressEvent 的 event,除非,你在 QTableWidget 四周的那条窄窄的边界上(默认一个 pixel 宽度)点击鼠标。奇怪的是,你可以接收到 Wheel 事件。原因为何,尚未深究。

二.关于tableWidget鼠标移动事件

在使用第一节中的方法捕获处理tableWidget鼠标事件时,MouseMove鼠标移动消息,并不能有效的捕获并处理,为什么会这样?

因为要开启该控件的鼠标捕获功能,才可以正常捕捉到MouseMove消息

tableWidget->setMouseTrack(true)    //开启捕获鼠标功能

以上是关于QT中QTableWidget鼠标事件捕获的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PyQt5 中捕获 QTableWidget 上的左右鼠标单击事件?

Ctrl+鼠标左键点击事件捕获Qt

事件过滤器未捕获 Qt 鼠标移动事件

Qt4:未捕获 QTableView 鼠标按钮事件

如何使用 pytest-qt 鼠标单击在 QTableWidget 中选择一个项目?

Qt:在委托绘制事件中渲染时如何增加 QTablewidget?