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?