2016-10-08 11 views
1

我想在我正在编写的小部件上使用Gtk.Widget的ìnstall_style_property()。在文档,这种方法被声明为static,所以我很奇怪,为什么华劣克仍然抱怨说,我从一个静态方法调用它:Valac不会让我从静态方法“install_style_property”

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: Access to instance member `Gtk.Widget.install_style_property' denied

如果这样做不工作,在Gtk中将自定义样式属性安装到自定义小部件的首选模式是什么?就个人而言,我不希望在使用我的小部件之前调用init(),但是由于添加样式属性是按类而不是每个实例完成的,因此将其放入构造函数看起来不正确。

回答

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); 
    } 
} 
+0

它没有标记为静态,它被标记为类。见https://git.gnome.org/browse/vala/tree/vapi/gtk+-3.0.vapi?id=48ca4e0fc480c3610e3a115376b86a1cee6c68f2#n6782 – nemequ

+0

@nemequ那么这是一个valadoc.org问题(最近valadoc.org有很多问题,它似乎...) – andlabs

+0

啊,我甚至没有想过看valadoc(我通常只使用vapis和c文档)。这可能不是一个新问题;类方法非常少见,所以在假定!instance == static的情况下可能存在一些错误的逻辑。 – nemequ