Qt上下文菜单在QTreeView中打破选择

时间:2008-10-06 06:10:26

标签: qt user-interface contextmenu 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中的项目将删除上下文菜单,但不会选择单击的项目。

当右键单击新项目时,这尤其令人迷惑,因为上下文菜单会弹出新项目,但由于未选择项目,上下文菜单的内容将引用之前选择的项目。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

对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());
}

答案 2 :(得分:1)

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

这仍然标记为待定,因此在此期间我会按照Shy的建议截断右键并自行进行选择。