2016-07-28 83 views
1

根据GTK API参考,GtkAboutDialog的"license-type"属性仅存在于GTK> = 3.0中。出于兼容性考虑,我的代码目前检查设置“牌照型”属性在之前版本的GTK:有没有办法检查一个GTK widget是否支持一个属性而不检查版本号?

-- This is Lua code binding to GTK via lgi 
local dialog = Gtk.AboutDialog { 
    title = "About Me", 
    -- ..., 
} 
if Gtk.check_version(3,0,0) == nil then 
    dialog.license_type = Gtk.License.MIT_X11 
end 

而不是做这个的,有没有办法直接询问GTK如果一个widget支持一定的财产?我觉得代码会更自我记录和更少的错误,如果容易因为这个问题实际上是关于GTK的API,我与任何编程语言回答OK,我可以写的东西看起来像

if supports_property(dialog, "license-type") then 
    dialog.license_type = Gtk.License.MIT_X11 
end 

。虽然这些例子都在Lua中,但我假设类似的问题应该出现在其他动态语言绑定或C中,假设有一种方法可以在不通过访问函数的情况下通过名称来设置属性。

回答

2

你并不需要使用_property场就像你在你的currently accepted answer做,因为LGI找到直接的类型分类表中的所有名称。此外,还可以使用_type访问器获取实例的类型。所以我推荐以下解决方案:

if dialog._type.license_type then 
    dialog.license_type = Gtk.License.MIT_X11 
end 
1

您可以使用g_object_class_find_property()函数查看属性是否存在。

请注意,这个函数需要一个GObjectClass,而不是GObject实例。所有GObject类都有这些类 - 实例对,类结构用于像vtable方法这样的共享事物。要以C语言获得与对象实例关联的GObjectClass,可以使用G_OBJECT_GET_CLASS()宏。 (如果你想在Lua中这样做,并且如果Lua不能调用那样的C宏,那么你必须跟踪G_OBJECT_GET_CLASS()的定义。)

+0

感谢您的回答。不幸的是,我从未设法在Lua中调用“find_property”,因为我使用的Lua接口将所有的类包装在表格中,并且不会暴露“find_property”需要的GObjectClass指针。好消息是我找到了一种解决我的问题的方法(只有Lua)。 – hugomg

+0

很高兴知道。这个解决方案在任何地方记录在lgi中? – andlabs

+0

肯定不知道,我有点自己想清楚了。然而,'_property'表是一个公共API,所以我认为它很好。 – hugomg

1

在lgi中,类的属性存在于_property字段中:

if Gtk.AboutDialog._property.license_type then 
    dialog.license_type = Gtk.License.MIT_X11 
end 
相关问题