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

时间:2010-01-27 00:37:40

标签: user-interface qt qt4

我有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事件!”消息。

2 个答案:

答案 0 :(得分:10)

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

我因此建议:

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

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

希望它有所帮助!

答案 1 :(得分:2)

如果您需要显示上下文菜单,可以使用tableview的{​​{3}}信号;您需要将上下文菜单策略设置为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;
}

希望这有帮助,问候。