1

我有一个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显示上下文菜单时单击项目将删除上下文菜单,但不会选择单击的项目。

当右键单击新项目时,这尤其令人迷惑,因为上下文菜单会在新项目上弹出,但是由于未选择该项目,因此上下文菜单的内容是指先前选择的项目。

4

3 回答 3

2

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

于 2008-10-06T07:39:07.463 回答
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());
}
于 2008-10-06T08:03:11.720 回答
1

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

这仍然被标记为待处理,所以同时我会按照 Shy 的建议拦截右键并自己进行选择。

于 2008-10-06T08:08:39.337 回答