我Dialog
分别显示文件夹(在treeView
)和文件(在listView
中)。在 listView doubleClick
信号由Qt创建的插槽处理,而我使用Designer实现了aproppriate插槽。问题是我无法处理RIGHT MOUSE
点击。有解决方案吗?
P.S。
我已经google了一段时间来解决这个问题,似乎继承QListView并覆盖解决问题。但就我而言,我已经使用Designer填充了Qt的标准QListView
。
答案 0 :(得分:2)
在这种情况下,您可以使用事件过滤器:
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
}
答案 1 :(得分:0)
在我的情况下,当用户右键单击QListView中的一行时,我开始尝试捕获鼠标事件,但它们从未通过。但是,我真正想做的就是弹出一个上下文菜单,结果发现contextMenuEvent确实通过了!所以我没有必要继承QListView,只是在我的包含QListView的小部件中添加了一个contextMenuEvent()。
这是Qt3,所以你的里程肯定会有所不同。