原文地址 ==> http://realvita.wordpress.com/2008/08/20/retrieving-mousepressevent-from-qtablewidget/
{
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);
第二种方法,通过右键菜单方式实现,原文地址 ==> http://edsionte.com/techblog/archives/3014
4.为表格数据添加右键菜单
有时候我们想通过点击鼠标右键对表格数据进行一些其他操作,比如复制、查看详情等,我们可以按照下面的方法来实现。为了实现点击右键弹出菜单这个功能,我们必须在类studentInfo类中声明一个菜单变量popMenu和一个菜单选项变量action。
01 | class studentInfo : public QMainWindow |
02 | { |
03 | ………… |
04 | private : |
05 | Ui::studentInfo *ui; |
06 | QMenu *popMenu; |
07 | QAction *action; |
08 | |
09 | private slots: |
10 | void on_stuTableWidget_customContextMenuRequested(QPoint pos); |
11 | ………… |
12 | }; |
声明完毕后,我们在studentInfo类的构造函数中对其进行初始化,如下:
1 | ui->stuTableWidget->setContextMenuPolicy(Qt::CustomContextMenu); |
2 | popMenu = new QMenu(ui->stuTableWidget); |
3 | action = new QAction( "Copy" , this ); |
setContextMenuPolicy方法用来设置widget菜单项的显示方法,而CustomContextMenu是唯一与邮件菜单有关的参数,因此这里我们将菜单显示方法设置为该类型。如果widget设置为CustomContextMenu时,当在数据上点击右键时就会发送customContextMenuRequested ( const QPoint & pos )信号,该信号还会捕捉到点击右键的位置,并用pos参数来存储。与此信号关联的槽函数我们定义如下:
1 | void studentInfo::on_stuTableWidget_customContextMenuRequested(QPoint pos) |
2 | { |
3 | popMenu->addAction(action); |
4 | popMenu->exec(QCursor::pos()); |
5 | } |
我们首先将菜单选项action添加到邮件弹出菜单popMenu中,再通过exec方法在pos()位置显示该邮件菜单,pos()返回的位置即为点击鼠标的位置。
现在,如果点击右键菜单选项并不会发生任何动作,这是因为我们并没有关联相应的槽函数。由于具体的菜单选项不同,其函数的实现也不同,这里我们只给出框架,如下:
1 | void studentInfo::rightClickedOperation() |
2 | { |
3 | //do something |
4 | } |
定义好槽函数,最关键的是与相应的信号连接。对于上述两个槽函数,我们可以使用两种方法进行信号和槽的关联:在Qt Desinger模式下添加或手动进行connect关联。对于customContextMenuRequested信号,我们使用前种方法实现信号和槽的关联;对于右键菜单选项的功能实现,我们可以通过connect函数实现,如下:
1 | connect(action, SIGNAL(triggered()), this , SLOT(rightClickedOperation())); |