2016-07-28 35 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 
相關問題