在QListView中处理鼠标事件

问题描述 投票:1回答:2

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

附:我已经google了一段时间来解决这个问题,似乎继承QListView并覆盖解决问题。但在我的情况下,我已经使用Designer填充了Qt的标准QListView

qt qt4 qt5 qt4.8
2个回答
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
}

0
投票

在我的例子中,当用户右键单击QListView中的一行时,我开始尝试捕获鼠标事件,但它们从未通过。但是,我真正想做的就是弹出一个上下文菜单,结果发现contextMenuEvent确实通过了!所以我没有子类QListView,只是在我的包含QListView的小部件中添加了一个contextMenuEvent()。

这是Qt3,所以你的里程肯定会有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.