用户界面-Qt上下文菜单打破了QTreeView中的选择



我有一个QTreeView类,它安装了如下上下文菜单:

m_ui.tree->setContextMenuPolicy(Qt::CustomContextMenu);
connect(m_ui.tree, SIGNAL(customContextMenuRequested(const QPoint&)),
        this, SLOT(ShowTreeContextMenu(const QPoint&)));
...
void ShowTreeContextMenu(const QPoint& point)
{
   m_treeContextMenu->exec(m_ui.tree->viewport()->mapToGlobal(point));
}

但是,当显示上下文菜单时,QTreeView将不再响应鼠标单击。在显示上下文菜单时单击QTreeView中的项目将删除上下文菜单,但不会选择单击的项目。

当右键单击一个新项目时,这尤其会让人迷失方向,因为上下文菜单会在新项目上弹出,但由于该项目没有被选择,上下文菜单的内容指的是以前选择的项目。

我尚未验证的一个可能的解决方案是捕获右键单击的单击事件,在树视图中手动进行选择,然后调用父单击事件,这将依次激活上下文菜单。

您没有说明您使用的是哪个版本的Qt,但我们在Qt4.4.0中发现了同样的问题,它在4.3中起作用。我们向Trolltech报告了这一错误225615

这仍然被标记为待定,所以在此期间,我会听从Shy的建议,拦截右键单击并自己进行选择。

将QTreeView子类化,并添加受保护的方法void contextMenuEvent(QContextMenuEvent*event);在这种方法中,您可以执行QMenu:

class TreeView : public QTreeView{
  Q_OBJECT
public:
  TreeView(QWidget *parent);
  ~TreeView();
protected:
  void contextMenuEvent(QContextMenuEvent *event);
};
void TreeView::contextMenuEvent(QContextMenuEvent *event){
  QMenu menu(this);
  menu.addAction(action1);
  menu.addAction(action2);
  //...
  menu.addAction(actionN);
  menu.exec(event->globalPos());
}

最新更新