【问题标题】:Qt context menu breaking selection in QTreeViewQTreeView中的Qt上下文菜单中断选择
【发布时间】:2008-10-06 06:10:26
【问题描述】:

我有一个 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 4.4.3 中得到修复

标签: qt user-interface contextmenu qtreeview


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我认为这已经解决了。我正在使用 4.4.3,它似乎可以正常工作。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多