根据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>
答案 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