Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 在QListView中处理鼠标事件_Qt_Qt4_Qt5_Qt4.8 - Fatal编程技术网

Qt 在QListView中处理鼠标事件

Qt 在QListView中处理鼠标事件,qt,qt4,qt5,qt4.8,Qt,Qt4,Qt5,Qt4.8,我有一个对话框,分别显示文件夹(在treeView)和文件(在listView)。在列表视图中双击信号由Qt在我使用Designer时创建的插槽处理,该插槽具有要实现的适当插槽。问题是我无法处理鼠标右键单击。有解决办法吗 附言。 我用谷歌搜索了一段时间来解决这个问题,似乎继承QListView和重写解决了这个问题。但在我的例子中,我已经使用Designer填充了Qt的standartQListView。在这种情况下,您可以使用事件过滤器: bool MainWindow::eventFilter

我有一个
对话框
,分别显示文件夹(在
treeView
)和文件(在
listView
)。在列表视图中
双击
信号由Qt在我使用Designer时创建的插槽处理,该插槽具有要实现的适当插槽。问题是我无法处理鼠标右键单击。有解决办法吗

附言。
我用谷歌搜索了一段时间来解决这个问题,似乎继承QListView和重写解决了这个问题。但在我的例子中,我已经使用Designer填充了Qt的standart
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);
}

可能会增加你的问题。如果您希望在用户单击鼠标左键或右键时执行不同的操作,您应该在过滤器中处理鼠标左键和右键单击,而不使用双击信号(因为它在两种情况下都发出信号),并且您的代码可以类似于:

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
}
QMouseEvent*ev=静态广播(事件);
如果(ev->buttons()&Qt::RightButton)
{
qDebug()按钮()&Qt::LeftButton)
{

qDebug()在我的例子中,当用户右键单击QListView中的一行时,我开始尝试捕捉鼠标事件,但它们从未出现。然而,我真正想做的是弹出一个上下文菜单,结果发现contextMenuEvent确实出现了!所以我不必为QListView创建子类,只需添加一个contextMenuEvent()到包含QListView的我的小部件


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

谢谢你的回答!这在Dialog中有效吗?因为我用
QDialog
推荐了这个项目?很抱歉问这个小问题?@elgolondrino是的,只写Dialog而不是MAinWindow,但为什么你不能使用双击信号?当用户点击时,你想要不同的反应吗s鼠标右键或左键?
void main window::on_listView_双击(const QModelIndex&index){qDebug()因为我已经使用了那个插槽来打开
listView
中的文件,不想在
右键双击中打开文件,而是只在左键中打开文件!:)一个问题,你能告诉我为什么要返回
QObject::eventFilter(obj,event)
在重写方法中?@elgolondrino最佳答案在doc中:
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
}