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

Posted

技术标签:

【中文标题】Qt4:未捕获 QTableView 鼠标按钮事件【英文标题】:Qt4: QTableView mouse button events not caught 【发布时间】:2010-01-27 00:37:39 【问题描述】:

我有一个QTableView,我在其中显示了一个自定义模型。我想点击鼠标右键,以便可以在基础表数据上打开上下文下拉菜单:

MainWindow::MainWindow()

  QTableView * itsView = new QTableView;
  itsView->installEventFilter(this);
  ... //Add other widgets and display them all


bool MainWindow::eventFilter(QObject * watched, QEvent * event)

  if(event->type() == QEvent::MouseButtonPress)
    printf("MouseButtonPress event!\n");
  else if(event->type() == QEvent::KeyPress)
    printf("KeyPress event!\n");

奇怪的是,我正确地得到了所有 KeyPress 事件:当我突出显示一个单元格并按下一个键时,我得到了“KeyPress 事件!”消息。但是,当我单击整个表格周围的非常细的边框时,我只会收到“MouseButtonPress 事件!”消息。

【问题讨论】:

【参考方案1】:

这是因为 Tableview 是这么细的边框...如果您想访问小部件的内容,您应该将 eventFilter 安装在 Tableview 的视口上!

因此我建议:

QTableView * itsView = new QTableView;
itsView->viewport()->installEventFilter(this);

试试这个,它应该可以解决你的问题!

希望对你有帮助!

【讨论】:

六年后,这个答案为我节省了很多时间和烦恼。谢谢! @GuyGizmo 我很高兴听到这个消息 :) 感谢您光临 ;)【参考方案2】:

如果需要显示上下文菜单,可以使用tableview 的customContextMenuRequested 信号;您需要将上下文菜单策略设置为 Qt::CustomContextMenu 才能触发此信号。像这样的:

...
itsView->setContextMenuPolicy(Qt::CustomContextMenu);
QObject::connect(itsView, SIGNAL(customContextMenuRequested(const QPoint &)),
                 this, SLOT(tableContextPopup(const QPoint &)));
...

void MainWindow::tableContextPopup(const QPoint & pos)

    qDebug() << "show popup " << pos;

希望这会有所帮助,问候。

【讨论】:

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

Linux QT 中控件QTableView相应鼠标事件

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

AvaloniaUI:全局捕获鼠标按钮向上/向下

Qt 的鼠标事件

QT QTableview QItemDelegate 简单使用

在 Mac OS X 中最大化或全屏显示窗口后,Java 停止捕获鼠标移动事件