Valac不会让我" install_style_property"来自静态方法

时间:2016-10-08 12:43:53

标签: gtk vala

我想在我写的小部件上使用Gtk.Widget' ìnstall_style_property ()。在文档中,此方法声明为static,所以我想知道为什么valac仍抱怨我从静态方法调用它:

public class MyClass : Gtk.Widget {

    public static void init () {
        ParamSpecDouble _the_property = new ParamSpecDouble
        (
            "dummy", "dummy", "dummy,
            0, double.MAX, 0,
            ParamFlags.READWRITE | ParamFlags.STATIC_STRINGS
        );
        install_style_property (_the_property);
    }
}

void main (string? argv) {
    Gtk.init (ref argv);
    MyClass.init ();
}

错误消息:

  

test.vala:11.9-11.46:error:访问实例成员`Gtk.Widget.install_style_property'拒绝

如果这不起作用,在Gtk中为自定义小部件安装自定义样式属性的首选模式是什么?就个人而言,我不希望在使用我的小部件之前不必调用init (),但是因为添加样式属性是按类而不是按实例完成的,所以将它放入构造函数似乎也不正确。 / p>

1 个答案:

答案 0 :(得分:1)

install_style_property()不是static;它实际上是class方法。 valadoc.org出于某种原因显示static;您可能不得不将此报告为错误(如果它还没有)。

class个方法在类本身上运行 。 GObject类具有共享元数据,这些方法修改了元数据。只有在首次初始化类时才应修改此类元数据;因此,只应在该类GObjectClass.class_init()方法中调用这些方法。在Vala中,这是static construct方法:

public class MyClass : Gtk.Widget {

    static construct {
        ParamSpecDouble _the_property = new ParamSpecDouble
        (
            "dummy", "dummy", "dummy,
            0, double.MAX, 0,
            ParamFlags.READWRITE | ParamFlags.STATIC_STRINGS
        );
        install_style_property (_the_property);
    }
}