我有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事件!”消息。
答案 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;
}
希望这有帮助,问候。