我可以向 GTK 添加自定义小部件,如此处所示。现在我想向自定义小部件添加属性并让它们显示在林间空地中。这可能吗?
我已向自定义小部件添加了属性,如此处所示,但这些属性未显示在林间空地中。
更新
林间空地目录似乎支持
<parameter-spec>
元素,可用于定义要在林间空地中公开的属性,如下所示。
<glade-widget-class title="Awesome TextView" name="AwesomeTextView" generic-name="awesome_text_view">
<properties>
<property id="num_fidgets" name="Number of fidgets" default="4" save="False" custom-layout="True">
<parameter-spec>
<type>GParamInt</type>
<min>4</min>
</parameter-spec>
<tooltip>The number of fidgets</tooltip>
</property>
</properties>
</glade-widget-class>
我已经定义了一个这样的属性,但它没有显示在林间空地中。相反,我收到错误消息:
GLib-GObject-CRITICAL **: 16:07:45.433: g_object_set_is_valid_property: object class 'AwesomeTextView' has no property named 'num-fidgets'
自定义小部件
AwesomeTextView
本质上定义为:
class AwesomeTextView (Gtk.TextView):
__gtype_name__ = 'AwesomeTextView'
num_fidgets = GObject.Property(type=int, default='4', nick='num_Fidgets')
<parameter-spec>
repo中有受支持的
<type>
的示例。更正:
<parameter-spec>
已记录。本文档可以通过 glade repo中受支持的
<type>
的示例进行补充。
更新2
找到错误原因。默认参数的类型错误 -
str
而不是 int
。该属性应该是:
num_fidgets = GObject.Property(type=int, default=4, nick='num_Fidgets')
Glade 不再发出错误。但该属性没有显示在 UI 中。
过于复杂的解决方案(请参阅更新以获得更简单的解决方案)
找到最后一块。不要将
<property>
属性 custom-layout
设置为 "True"
- 除非您知道在做什么,即您知道如何正确布局属性(我不知道,至少现在还没有)。我的建议是,在更新后的目录中设置custom-layout="False"
,如下所示:
<glade-catalog name="awesome_text_view" library="gladepython" domain="glade-3" depends="gtk+">
<init-function>glade_python_init</init-function>
<glade-widget-classes>
<glade-widget-class title="Awesome TextView" name="AwesomeTextView" generic-name="awesome_text_view">
<properties>
<property id="num_fidgets" name="Number of fidgets" default="4" save="True" custom-layout="False">
<parameter-spec>
<type>GParamInt</type>
<min>4</min>
</parameter-spec>
<tooltip>The number of fidgets</tooltip>
</property>
</properties>
</glade-widget-class>
</glade-widget-classes>
<glade-widget-group name="Python" title="Python">
<glade-widget-class-ref name="AwesomeTextView"/>
</glade-widget-group>
</glade-catalog>
结果:
为了完整起见,这里是示例自定义小部件类
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import GObject
from gi.repository import Gtk
class AwesomeTextView(Gtk.TextView):
__gtype_name__ = 'AwesomeTextView'
num_fidgets = GObject.Property(type=int, default=4, nick='num_fidgets')
def __init__(self):
Gtk.TextView.__init__(self)
更新
结果是属性声明中的
nick
参数
num_fidgets = GObject.Property(type=int, default=4, nick='num_fidgets')
是该属性在空地 UI 中显示所需的全部内容。元素
<properties>
更适合更复杂的值,例如枚举。我将保留更复杂的答案,以防它对任何人有用。