在 QListView 中处理鼠标事件



Dialog分别显示文件夹(以treeView为单位)和文件(以listView为单位)。在listViewdoubleClick信号由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,所以你的里程肯定会有所不同。

相关内容

  • 没有找到相关文章

最新更新