我Dialog
分别显示文件夹(以treeView
为单位)和文件(以listView
为单位)。在listView中doubleClick
信号由Qt创建的插槽处理,而我使用设计器和要实现的适当插槽。问题是我无法处理RIGHT MOUSE
点击。有解决办法吗?
附言我已经用谷歌搜索了一段时间来解决这个问题,似乎继承 QListView 并覆盖可以解决问题。但就我而言,我已经使用设计器填充了Qt的标准QListView
。
您可以使用事件过滤器:
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == ui->listView->viewport() && event->type() == QEvent::MouseButtonDblClick)
{
QMouseEvent *ev = static_cast<QMouseEvent *>(event);
if (ev->buttons() & Qt::RightButton)
{
qDebug()<< "double clicked" << ev->pos();
qDebug()<< ui->listView->indexAt(ev->pos()).data();
}
}
return QObject::eventFilter(obj, event);
}
要使用eventFilter
您还应该:
protected:
bool eventFilter(QObject *obj, QEvent *event);//in header
和
qApp->installEventFilter(this);//in constructor
可能会增加您的问题。如果你想在用户单击鼠标左键或右键时做不同的事情,你应该在过滤器中处理以免和右键点击,没有双击信号(因为它在这两种情况下都会发出信号),你的代码可以是这样的:
QMouseEvent *ev = static_cast<QMouseEvent *>(event);
if (ev->buttons() & Qt::RightButton)
{
qDebug()<< "RightButton double clicked";
//do something
}
if (ev->buttons() & Qt::LeftButton)
{
qDebug()<< "LeftButton double clicked";
//do something
}
就我而言,当用户右键单击QListView中的一行时,我开始尝试捕获鼠标事件,但它们从未通过。 然而,我真正想做的只是弹出一个上下文菜单,事实证明上下文菜单事件确实通过了! 所以我不必对QListView进行子类化,只需在包含QListView的小部件中添加了一个contextMenuEvent()。
这是Qt3,所以你的里程肯定会有所不同。