Gtk::Actionable Gtk::RadioToolButton?
Posted
技术标签:
【中文标题】Gtk::Actionable Gtk::RadioToolButton?【英文标题】:Gtk::Actionable Gtk::RadioToolButton? 【发布时间】:2014-07-30 20:28:13 【问题描述】:我正在使用 gtkmm 构建用户界面。我要完成的任务是从已经是菜单和工具栏的一部分的操作构建一个单选按钮。我想要新按钮来代理现有操作。
一个可能的候选者是 Gtk::Action::create_tool_item()。其文档指出:
已弃用:3.10:使用 Gtk::ToolItem 并使用 Gtk::Actionable::set_action_name() 将其与 Action 关联
所以,我希望 ToolItem 和通过继承 RadioToolButton 来实现这个接口。在 gtkmm-3.12 中没有,稳定的文档也反映了这一点。
但是,C 库 gtk-3.0 RadioToolButton 确实实现了这个接口。所以,我的问题是这样的。
gtkmm Gtk::RadioToolButton 是否应该实现 Gtk::Actionable?缺少此接口是疏忽,还是有其他方式支持 Actionable 的功能?
有一个函数 set_related_action() 可以关联单选按钮的正确图标。它似乎没有将按钮放入组中,它也已被弃用。
【问题讨论】:
我找到了前进的方向,但这只是令人困惑。 Gtkmm 的 UI 管理器包装了 Gtk+ UI 管理器。 Gtk+ UI 管理器 (v3.12) 源代码位于 gtk/deprecated 目录中。文档中似乎没有任何内容可以解释替换它的内容,并且这些示例将 UI 管理器作为便利的顶峰......它似乎确实如此。在 UI 管理器的实现中,工具栏的工具项是使用 create_tool_item() 调用创建的,该调用在文档中已弃用。所以,我想我的错误是假设不推荐使用的接口有后继者。也许还没有。 如果您使用 GtkBuilder 构建您的 ui,那么您可以在构建器 XML 中为单选按钮指定操作名称。我认为 GtkBuilder 是 GtkUIManager 更强大的替代品 我相信你是对的,因为 GTK+ 正在从 UI 管理器转移到 GtkBuilder。我将这个问题发布到 GTK+ 列表中,并被告知这些接口在不断变化,GTKMM 将在下一个主要版本中赶上 GTK+。 @PhillipWood,使用 Gtk::Builder,如何为激活的 RadioToolButton 指定目标参数? 【参考方案1】:我也有同样的问题。这当然没有尽可能清楚地记录下来。但我在邮件列表中发现了一个帖子(可能也是你的!),这是在这个帖子几个月后,它回答了你的两个主要问题,我认为值得为未来走同样道路的人发帖。
总结一下:
没有这个接口是疏忽吗
当然不是:这是一个深思熟虑的决定,出于一个极其重要的原因。
还是有其他方式支持 Actionable 的功能?
谢天谢地,是的。
线程在这里 - https://mail.gnome.org/archives/gtkmm-list/2014-December/msg00002.html - 这是来自主要维护者的官方回复:
但是,gtkmm 版本,Gtk::Button 不继承自 Gtk::可操作。因此该功能不可用。 那里 是 button.h 中的 TODO:
//TODO:当我们可以破坏 ABI 时,派生(并实施)Actionable。
这是什么意思?我以为 gtk3 和 gtkmm3 保持同步, 即 gtkmm3-3.14 关于 gkt3-3.14 的功能是否完整?是 这个功能将被实现(何时)?
[剪辑]
我们不能在不破坏 ABI 的情况下向 C++ 类添加基类 - 那 通常意味着导致当前使用该 ABI 的所有应用程序 坠毁。 显然我们不想这样做。 进行并行安装,例如当我们从 gtkmm-2.4 到 gtkmm-3.0,不影响当前安装的应用程序。
您可以同时执行以下操作: gtk_actionable_set_action_name(theButton.gobj(), "somename");
见: https://developer.gnome.org/gtkmm-tutorial/stable/sec-basics-gobj-and-wrap.html.en
-- 穆雷卡明
注意:第一个参数必须是GTK_ACTIONABLE( theButton.gobj() )
。 GLib 风格的对象只是不透明的指针。 C++ 编译器不能在这种前向声明的 C struct
s 之间进行隐式转换(即使它们作为“基类”相互包含)。此外,因为这里我们必须从“对象”(GtkButton
)转换为“接口”(GtkActionable
),所以隐式转换不起作用:接口可以位于其父对象内的任何位置,因此地址必须在施法过程中进行调整。 GTK_BLAH()
宏涵盖了这一点。
反正我跑题了... gtkmm 4可以肆无忌惮地破解ABI,GTK+ 4的开发已经开始,所以Actionable接口现在由GtkButton
实现。现在也应该解决所有或大多数其他需要 ABI 中断的 TODO
s。如果您发现 gtkmm 3 中缺少某些内容并且尚未添加到 4 中,请提交错误报告以对其进行排序。
【讨论】:
以上是关于Gtk::Actionable Gtk::RadioToolButton?的主要内容,如果未能解决你的问题,请参考以下文章