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 上的左右鼠标单击事件?