在空地中公开 GTK3 自定义小部件属性

问题描述 投票:0回答:1

我可以向 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 中。

gtk3 glade custom-widgets
1个回答
0
投票

过于复杂的解决方案(请参阅更新以获得更简单的解决方案)

找到最后一块。不要将

<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>
更适合更复杂的值,例如枚举。我将保留更复杂的答案,以防它对任何人有用。

© www.soinside.com 2019 - 2024. All rights reserved.