【发布时间】:2021-12-29 22:18:21
【问题描述】:
例如,我想创建一个非常简单的 Gtk 复合对象,它是 GtkBox 中的 GtkButton。而已。我们就叫它BoxedButon
但是,我希望它具有 GtkButton 的界面。相同的属性、信号、方法等。
如果我派生一个父类为GTK_TYPE_BUTTON 的新类,那么GTK_BUTTON((BoxedButton*)a_boxed_button_instance) 将起作用。它实际上具有按钮的界面。
但它不能添加到容器中,因为当添加BoxedButton 时,它会尝试添加与GtkButton 对应的GtkWidget,它已经在GtkBox 中,即BoxedButton也包含。
如果该类是从GTK_TYPE_BOX 的父类派生的,则将其添加到容器中是可行的。但它没有GtkButton 的接口。每个属性、信号、gtk_button_* 方法等都需要复制。这比新类需要做的任何其他事情都要多一个数量级的代码。
我想也许我可以覆盖set_parent(),以便它设置盒子的父代。但是GtkBoxClass 没有set_parent(),因此显然将小部件添加到渲染层次结构中发生的任何事情都不能被覆盖。
有什么方法可以不涉及数百行代码吗?
【问题讨论】:
-
使用您的第一个解决方案:也许您可以先转换为
GtkBox,然后再调用add? -
它不是从
GtkBox派生的,因此无法转换为该类型。 -
也许如果有办法在 gobject 中进行多重继承,它可以从两者派生,但我认为这是可能的。
-
好的,抱歉我误会了。它的组成。那么也许是 GtkBox 的吸气剂?