我正在使用gtkmm来构建UI。我正在尝试完成的任务是从已经是菜单和工具栏一部分的动作构建一个单选按钮。我希望新按钮代理现有操作。
一个可能的候选人是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(),它关联单选按钮的正确图标。它似乎没有将按钮放入组中,也不推荐使用。
答案 0 :(得分:0)
我有同样的问题。这当然没有尽可能明确地记录在案。但是我在邮件清单上发现了一个帖子(可能也是你的!),这个帖子在这个问题的几个月之后就已经找到了,它回答了你们的两个主要问题,而且我认为值得发布给未来的人们遵循同样的道路。
总结:
缺少此表面是否存在疏忽
当然不是:这是一个刻意的决定,这是一个极其重要的原因。
还是有其他方式支持Actionable的功能吗?
谢天谢地,是的。
线程在这里 - https://mail.gnome.org/archives/gtkmm-list/2014-December/msg00002.html - 这是主要维护者的官方回复:
但是,gtkmm版本,Gtk :: Button不会继承 GTK ::可操作。因此,该功能不可用。的有 是button.h中的TODO:
// TODO:当我们可以破坏ABI时,从(并实施)中获取。
这是什么意思?我认为gtk3和gtkmm3保持同步, 关于gkt3-3.14,gtkmm3-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
之间隐式转换(即使它们彼此包含为'基类')。此外,因为在这里我们必须从'object'(GtkButton
)转换为'interface'(GtkActionable
),所以隐式转换不起作用:接口可以位于其父对象中的任何位置,因此必须在演员表中调整地址。 GTK_BLAH()
宏涵盖了此内容。
无论如何,我离题了... gtkmm 4可以打破ABI而不受惩罚,GTK + 4开发已经开始,所以Actionable界面现在由GtkButton
实现。现在也应该解决所有或大多数需要ABI中断的TODO
。如果您发现gtkmm 3中缺少某些内容并且尚未添加到4中,那么请提交错误报告以对其进行排序。