在QListView中处理鼠标事件

时间:2014-12-08 15:25:22

标签: qt qt4 qt5 qt4.8

Dialog分别显示文件夹(在treeView)和文件(在listView中)。在 listView doubleClick信号由Qt创建的插槽处理,而我使用Designer实现了aproppriate插槽。问题是我无法处理RIGHT MOUSE 点击。有解决方案吗?

P.S。 我已经google了一段时间来解决这个问题,似乎继承QListView并覆盖解决问题。但就我而言,我已经使用Designer填充了Qt的标准QListView

2 个答案:

答案 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,所以你的里程肯定会有所不同。