Gtk::可操作的Gtk:: RadioToolButton

Gtk::Actionable Gtk::RadioToolButton?

本文关键字:Gtk RadioToolButton 可操作      更新时间:2023-10-16

我使用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(),它为单选按钮关联正确的图标。它似乎没有将按钮放入组中,并且也不推荐使用。

我也有同样的问题。这一点当然没有尽可能清晰地记录下来。但是我在邮件列表(也许也是你的!)上发现了一个几个月后的帖子,它回答了你的两个主要问题,我认为它值得发布给未来走同样道路的人。

总结:

没有这个int接口是一个疏忽吗

当然不是:这是一个深思熟虑的决定,出于一个极其重要的原因。

或者是否有其他方式支持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

—Murray Cumming

注意:第一个参数必须是GTK_ACTIONABLE( theButton.gobj() )。glib风格的对象只是不透明的指针。c++编译器不能隐式地在这些前声明的C struct之间进行转换(即使它们彼此包含为"基类")。此外,因为这里我们必须从一个"对象"(GtkButton)强制转换到一个"接口"(GtkActionable),隐式强制转换将不起作用:接口可以位于其父对象中的任何位置,因此必须在强制转换期间调整地址。GTK_BLAH()宏涵盖了这一点。

不管怎样,我离题了…gtkmm 4可以不受约束地破坏ABI,并且GTK+ 4开发已经开始,因此Actionable接口现在由GtkButton实现。所有或大多数其他需要ABI中断的TODO现在也应该得到解决。
如果你发现gtkmm 3中缺少一些东西,并且还没有添加到gtkmm 4中,那么请提交一个bug报告来对其进行排序。