gpt4 book ai didi

c++ - 如何为 QTreeWidgetItem 的每个*类型*创建不同的弹出(上下文)菜单

转载 作者:太空狗 更新时间:2023-10-29 23:53:00 24 4
gpt4 key购买 nike

我能够为我的 QTreeWidget 创建一个上下文菜单,如下所示

QMenu* pContextMenu = new QMenu(this)
QTreeWidget* pTreeWidget = new QTreeWidget();
QAction* pOpenFile = new QAction(tr("Open A File"), pContextMenu);
pTreeWidget->setContextMenuPolicy(Qt::ActionsContextMenu);
pTreeWidget->addAction(pOpenFile);

但我想要一个不同于叶子的分支弹出窗口。如何根据点击的 widgetitem 类型分配不同的弹出窗口?

我的树:

  • 分支 1 <-- 弹出窗口 1
    • 叶子1
    • Leaf2 <-- Popup2
  • 分公司 2
    • 分公司 3
      • 叶子1

QWidget::actions() 未列为虚拟。否则我会从 QTreeWidget 派生我自己的类并重新实现 actions()。

最佳答案

方法一:覆盖QTreeWidget

正如您所发现的那样,分配给 QTreeWidget 本身的上下文菜单不会让您拥有针对不同项目的不同上下文菜单。

由于 Qt 项目 View 没有用于上下文菜单的特殊 API,因此您必须自己实现它。幸运的是,这并不难;你只需要:

  1. 创建 QTreeWidget 的子类。
  2. customContextMenuRequested(const QPoint&) 信号连接到自定义插槽。
  3. 显示所需的上下文菜单。

我发布了 complete working example .需要注意的一些细节包括:

  • QTreeWidgetItem 提供了一个方便的 type 属性,让您无需强制转换、字符串解析或其他笨拙/脆弱的方法即可轻松识别项目。

  • 自定义 QTreeWidgetItem 类型值应大于或等于 QTreeWidgetItem::UserType

  • 显示上下文菜单时,必须将全局位置传递给 exec()。要从插槽中小部件空间中的某个位置正确映射,您必须使用项目的视口(viewport)小部件。


方法二:覆盖QItemDelegate(和QTreeWidget ...)

另一种方法是实现您自己的 QAbstractItemDelegate 子类,并将其分配给您的树形小部件。在您的项目委托(delegate)中,您可以覆盖 editorEvent() 以同样的方式处理鼠标按下。

虽然 frres 这种做法实际上更符合 Qt 的项目 View API 设计,但这种做法有几个关键的缺点:

  • 项目委托(delegate)使用 QModelIndex 对象来表示项目。要转换为 QTreeWidgetItem,您必须使用 QTreeWidget::itemFromIndex() 方法。不幸的是,这是 protected,因此它实际上需要您继承 QTreeWidget 来为您的委托(delegate)提供此 API。这会为您的代码增加更多的样板复杂性。

  • editorEvent() Hook 在项目 View 处理事件之前被调用。这意味着您无法轻松地显示上下文菜单并同时允许默认行为(例如选择右键单击的项目)。

  • 由于 editorEvent() 处理程序会看到各种不同的事件,您必须更加小心才能正确处理它们。如果您的行为很复杂,您还必须注意不要让这个整体处理程序失去控制。

核心代码非常相似,但同样有更多的样板文件。我已经发布了 an example of this approach ,还有。

关于c++ - 如何为 QTreeWidgetItem 的每个*类型*创建不同的弹出(上下文)菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12937812/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com