如何在GTK工具栏中显示ToolItems的溢出菜单

时间:2017-06-20 05:40:03

标签: haskell gtk gtk3 gtk2

当工具栏不够宽以显示其内容时,GTK Toolbar可以显示溢出菜单。

如果工具栏包含由ComboBox包裹的ToolItem,则此功能似乎无效。

以下an example code演示了此问题。它是用Haskell编写的,但我想将其翻译成其他语言并不太难。

构建仓库的说明写在README.md

最后一个命令打开一个小GTK窗口。如果你把它做得更大,你会在窗口看到两个ComboBox es。问题是如果你使窗口变窄一点,那么即使ComboBox被启用,右toolbarShowArrow也会消失并且不会出现溢出菜单。

(很遗憾,我没有足够的声誉在SO上发布两个截图,所以我将它们上传到了回购。)

有趣的是,如果我将Toolbar的内容从ToolItem更改为ToolButton s,我会收到溢出菜单。

我还测试了3个包:GTK2为gtk,GTK3为gtk3,gobject内省为GTK3 gi-gtk。所有这些都有同样的问题。

所以问题是:这个问题是否有解决办法?

1 个答案:

答案 0 :(得分:0)

文档说明了这个about gtk_toolbar_set_show_arrow()

  

设置当toolbar没有空间容纳所有项目时是否显示溢出菜单。如果TRUE,则通过溢出菜单可以获得没有空间的项目。

所以,这是一个“溢出菜单”。我不会厌烦你进入GTK +源码,但只需说:你添加到Toolbar的项目需要提供菜单项以显示在溢出菜单中。听起来合乎逻辑,对吧? :d

ToolButtons工作是因为他们使用set_proxy_menu_item()来调用MenuItem,专门为此目的创建。{/ p>

这就是Toolbar在确定项目是否可以溢出时查找的内容:代理MenuItem,它可以放入溢出菜单 - 并且只有当它找到至少一个时才有任何意义给箭头打开那个菜单。

因此,如果您有其他小部件,可以通过以下任意一种方式在ToolItem上设置代理菜单项,将它们带入溢出菜单:

  • 只需致电gtk_tool_item_set_proxy_menu_item()即可设置特定商品
  • 连接::create-menu-proxy上的ToolItem信号,并在每次发布期间决定是否设置(或清除)代理项目

当然,您还可以::activateMenuItem关联ToolItem以执行与原始MenuItem相关的适当操作。

...尽管如果最终ToolItem孩子是ComboBox,您是否可以从ComboBox执行任何有用的操作,这是一个不同的问题。它不会将其弹出菜单显示为您可以使用的内容。我猜您可以将MenuItem的副本添加到Toolbar并将其用作代理...但在这种情况下,您可能会超出溢出菜单的范围for,而且应该确保您的<?php echo $variable; ?> 不会小到足以丢失此类控件。

或许不是!试一试,看看它是怎么回事。