Qt QTableView上下文菜单和正确选择

时间:2015-08-09 09:05:45

标签: qt delegates contextmenu qtableview qmenu

您好我正在使用OnInitDialog: ::SetWindowTheme(GetDlgItem(IDC_RADIO1)->GetSafeHwnd(), L"wstr", L"wstr"); HBRUSH CMFCApplication1Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { // Call the base class implementation first! Otherwise, it may // undo what we're trying to accomplish here. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // Are we painting the IDC_MYSTATIC control? We can use // CWnd::GetDlgCtrlID() to perform the most efficient test. if (pWnd->GetDlgCtrlID() == IDC_RADIO1) { // Set the text color to red pDC->SetTextColor(RGB(255, 0, 0)); // Set the background mode for text to transparent // so background will show thru. pDC->SetBkMode(TRANSPARENT); // Return handle to our CBrush object hbr = m_brush; } return hbr; } 自定义项委托。

我在委托中使用QTableView来显示上下文菜单,该菜单对于右键单击的每个项目都是不同的。 使用editorEvent显示菜单。

问题在于,当我右键单击未选中的单元格时,菜单会显示(阻止),并且只有在菜单消失后才会选择单元格。 这是因为代理首先捕获鼠标单击,然后传播到视图以进行选择。

我可以尝试哪种替代/解决方法?

  • QMenu::exec()在我的情况下不起作用,我认为因为点击传播会关闭菜单;
  • 处理代表中的选择?
  • 将上下文菜单代码从委托中移出到自定义控件类?
  • ...

修改

我确实抓住了QMenu::popup()。使用QEvent::MouseButtonPress代替首先选择单元格,然后显示上下文,但是如果在按下按钮的同时移动鼠标,则选择保留在您按下按钮的位置,同时按钮被释放的单元格出现上下文菜单。

我认为解决此问题的唯一方法是将此代码移出代理,如下所示。

2 个答案:

答案 0 :(得分:2)

如果您只需要在用户右键单击时显示菜单,则无需创建自定义项目委托。

您可以在mouseReleaseEvent时处理event->button() == Qt::RightButton并使用QTableView::selectionModel()获取所选项目。

希望它有所帮助。

答案 1 :(得分:2)

正如cdonts所建议的,使用委托来显示上下文菜单不仅不需要,而且表现也不佳。

我使用的是QWidget::setContextMenuPolicy(Qt::CustomContextMenu)和信号QWidget::customContextMenuRequested(QPoint)。这允许我在创建上下文菜单之前检查实际选择,询问视图的SelectionModel(可以在模型中完成,以便轻松自定义菜单并相应地编辑数据)。

请记住使用QTableView->viewport()->maptoglobalpos(point)获取菜单应显示的全局坐标。