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
}