Qt QTableView上下文菜单和右键选择
Qt QTableView context menu and right selection
您好,我正在使用带有自定义项目委托的 QTableView
。
我在委托中使用 editorEvent
来显示右键单击的每个项目都不同的上下文菜单。
使用 QMenu::exec()
显示菜单。
问题是,当我右键单击一个未选中的单元格时,会显示菜单(阻塞),只有在菜单消失后,该单元格才会被选中。
这是因为鼠标点击首先被委托捕获,然后传播到视图以进行选择。
我可以尝试哪个alternative/workaround?
QMenu::popup()
在我的情况下不起作用,我认为是因为点击传播关闭了菜单;
- 处理委托中的选择?
- 将上下文菜单代码从委托中移到自定义控件中 class?
- ...
编辑
我确实抓到了 QEvent::MouseButtonPress
。使用 MouseButtonRelease
而不是先选择单元格,然后出现上下文,但是如果您在按下按钮的同时移动鼠标,则选择保留在您按下按钮的位置,而上下文菜单出现在释放按钮的单元格上.
我认为解决此问题的唯一方法是按照下面的建议将此代码移出委托。
如果您只需要在用户单击鼠标右键时显示菜单,则无需创建自定义项委托。
您可以在 event->button() == Qt::RightButton
时处理 mouseReleaseEvent
并使用 QTableView::selectionModel()
获取所选项目。
希望对您有所帮助。
正如 cdonts 所建议的那样,使用委托来显示上下文菜单不仅不需要,而且性能也不佳。
我用过的是QWidget::setContextMenuPolicy(Qt::CustomContextMenu)
和信号QWidget::customContextMenuRequested(QPoint)
。这允许我在创建上下文菜单之前检查实际选择,询问查看其 SelectionModel(这可以在模型中完成以轻松自定义菜单并相应地编辑数据)。
记得使用 QTableView->viewport()->maptoglobalpos(point)
获取菜单应该出现的全局坐标。
按照@alez 的建议工作。为了获得我使用的坐标 QTableView->mapToGlobal(pos)
您好,我正在使用带有自定义项目委托的 QTableView
。
我在委托中使用 editorEvent
来显示右键单击的每个项目都不同的上下文菜单。
使用 QMenu::exec()
显示菜单。
问题是,当我右键单击一个未选中的单元格时,会显示菜单(阻塞),只有在菜单消失后,该单元格才会被选中。 这是因为鼠标点击首先被委托捕获,然后传播到视图以进行选择。
我可以尝试哪个alternative/workaround?
QMenu::popup()
在我的情况下不起作用,我认为是因为点击传播关闭了菜单;- 处理委托中的选择?
- 将上下文菜单代码从委托中移到自定义控件中 class?
- ...
编辑
我确实抓到了 QEvent::MouseButtonPress
。使用 MouseButtonRelease
而不是先选择单元格,然后出现上下文,但是如果您在按下按钮的同时移动鼠标,则选择保留在您按下按钮的位置,而上下文菜单出现在释放按钮的单元格上.
我认为解决此问题的唯一方法是按照下面的建议将此代码移出委托。
如果您只需要在用户单击鼠标右键时显示菜单,则无需创建自定义项委托。
您可以在 event->button() == Qt::RightButton
时处理 mouseReleaseEvent
并使用 QTableView::selectionModel()
获取所选项目。
希望对您有所帮助。
正如 cdonts 所建议的那样,使用委托来显示上下文菜单不仅不需要,而且性能也不佳。
我用过的是QWidget::setContextMenuPolicy(Qt::CustomContextMenu)
和信号QWidget::customContextMenuRequested(QPoint)
。这允许我在创建上下文菜单之前检查实际选择,询问查看其 SelectionModel(这可以在模型中完成以轻松自定义菜单并相应地编辑数据)。
记得使用 QTableView->viewport()->maptoglobalpos(point)
获取菜单应该出现的全局坐标。
按照@alez 的建议工作。为了获得我使用的坐标 QTableView->mapToGlobal(pos)