QT中QTableWidget鼠标事件

Posted 小哈龙

tags:

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

 本文转载自:【转】在 QTableWidget 部件上实现鼠标右键响应功能_Shining的博客-CSDN博客

有的时候,我们需要有一个 QTableWidget 在某个 Widget 的内部显示数据或者操作数据。对于一些需求,我们想通过右键或者中键来实现。而 QTableWidget 自己有一个 MousePressEvent 的 event 可以用来处理这些操作。可问题是,当这个 table 放在了一个 Widget 内部的时候,再用在 Visual Stadio 里面,你就无法实现这个函数了。那,怎么解决呢?

用 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
        
    



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

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 事件。原因为何,尚未深究。

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

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

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

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

qtablewidget怎样设置表

Qt下QTableWidget的使用

Qtablewidget 中单元格上的 MouseMove 事件以显示或打印消息