有没有办法检查GTK小部件是否支持属性而不检查版本号?

时间:2016-07-28 16:55:25

标签: lua gtk lgi

根据GTK API参考,GtkAboutDialog的"license-type"属性仅出现在GTK> = 3.0中。为了兼容性,我的代码目前在设置“license-type”属性之前检查GTK版本:

-- 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?我认为如果我能写出类似

的东西,那么代码会更加自我记录并且不易出错
if supports_property(dialog, "license-type") then
    dialog.license_type = Gtk.License.MIT_X11
end

由于这个问题实际上是关于GTK API的,所以我对任何编程语言的答案都很满意。虽然示例在Lua中,但我假设类似的问题应该出现在其他动态语言绑定中,甚至在C中,假设有一种方法可以通过名称设置属性而无需通过set_license_type访问器函数。 / p>

4 个答案:

答案 0 :(得分:3)

您不需要像在currently accepted answer中那样使用_property字段,因为lgi直接在类型类别表中查找所有名称。此外,还可以使用_type访问器获取实例的类型。所以我建议遵循以下解决方案:

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

答案 1 :(得分:2)

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

请注意,此函数采用GObjectClass,而不是GObject实例。所有GObject类都包含在这些类 - 实例对中,类结构用于共享事物,如vtable方法。要获得与对象实例关联的GObjectClass,在C中,您可以使用G_OBJECT_GET_CLASS()宏。 (如果你想在Lua中执行此操作,并且如果Lua不能像这样调用C宏,则必须跟踪G_OBJECT_GET_CLASS()的定义。)

答案 2 :(得分:1)

在lgi中,类的属性出现在其_property字段中:

if Gtk.AboutDialog._property.license_type then
    dialog.license_type = Gtk.License.MIT_X11
end

答案 3 :(得分:1)

如果由于某些原因你需要知道某个属性是否存在没有实例化它,你可以用这种方式使用@andlabs的想法:

local lgi   = require'lgi'
local Gtk   = lgi.require'Gtk'
local class = Gtk.AboutDialogClass()

-- Prints yes
if class:find_property('license') then print('yes') end

-- Does not print anything
if class:find_property('unknown') then print('yes') end