我有一个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());
}