我有一个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
中的项目将删除上下文菜单,但不会选择单击的项目。
当右键单击新项目时,这尤其令人迷惑,因为上下文菜单会弹出新项目,但由于未选择项目,上下文菜单的内容将引用之前选择的项目。
答案 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的建议截断右键并自行进行选择。