2016-05-17 82 views
0

我想重新實現一組使用GLIBMM的C++ GLIB類。 其中大多數是bug,需要擴展很多,因爲整個項目都是用C++完成的,所以在更正它之前,我首選移植代碼。gblimm/gtkmm自定義屬性

不幸的是,我不是GLIB的專家,即使我在官方文檔上花費了很多天,我仍然在理解一些概念方面遇到麻煩,特別是在屬性周圍。

據我所知,屬性是一個完整的替代(也許更多)的setter和getters。基本上,不是對每個屬性使用專門的方法,而是爲所有這些方法使用通用的set/get_property方法,使用名稱(或ID)訪問屬性並使用像GValue這樣的容器來保存多種類型的數據。

我能看到的唯一好處是能夠訪問包含在字符串中的名稱的屬性(可能來自配置文件),但我肯定錯過了一些東西。此外,這在GLIB中似乎是正確的,但在Glib :: ObjectBase中並不是這樣,它表示您應該更喜歡使用專用屬性_(*)getter/setter而不是property_set/get_value。

閱讀關於Glib :: Property的文檔我不確定C++中完整的屬性實現應該如何,我認爲缺乏GLIB的經驗會讓它更難。

我想每個屬性移動與性病屬性get/set方法,但我不想做了很大的改動發現爲時已晚,以前的計算策略是更好的時代:)

燦有人向我解釋屬性是什麼(如果與C++類屬性相比)?你能給我提供一個信號/插槽工作屬性的例子嗎?有人可以說明兩種方式的優點嗎?

謝謝!

回答

0

如果我們看看Glib屬性 GObject properties 的內幕,我們看到c實現在工作。上面的鏈接也有代碼的詳細解釋。

對象屬性

「其中一個GObject的不錯的功能是它的通用get/set方法的對象屬性的機制。當一個對象被實例化,對象的類初始化處理程序應該使用g_object_class_install_properties登記對象的屬性。

C中的一個更詳細的解釋++和C可以在兩個環節上找到。

的最佳方式,瞭解對象屬性是如何工作的是廁所在它是如何使用的一個真實的例子國王:

如果我們看一下Glib Property details我們可以看到

一個油嘴::對象屬性。

「這類包裝一個圖形對象屬性,提供C++ API到圖形對象屬性的系統,使用與從油嘴::對象或油嘴::接口派生類。

屬性是與一種類型的每個實例和爲每個屬性一些類數據相關聯的值:

  1. 其獨特的名稱,用於識別屬性。
  2. 一個可讀的暱稱。
  3. 簡短說明。
  4. 默認值以及最小和最大範圍(取決於屬性的類型)。
  5. 旗,限定,除其他事項外,該屬性是否可以被讀取或寫入。」

實施例參考GObject properties

class MyCellRenderer : public Gtk::CellRenderer 
{ 
public: 
MyCellRenderer() 
: 
Glib::ObjectBase (typeid(MyCellRenderer)), 
Gtk::CellRenderer(), 

類型定義的C或C等效++ (Constructor/Destructor)

Template Glib :: Property < T :: :: Property(Glib :: Object &對象, 常量油嘴:: ustring &名 )

mybool是名真正爲默認值

property_mybool(*此, 「mybool」,真) ,

property_myint_(*此, 「敏」,42)

{} 
virtual ~MyCellRenderer() {} 

//油嘴::物業<>可以是公開的,

**類的構造函數/析構函數如公共聲明或私人**

Glib::Property<bool> property_mybool; 
// or private, and combined with Glib::PropertyProxy<>. 
Glib::PropertyProxy<int> property_myint() { return property_myint_.get_proxy(); } 
private: 
Glib::Property<int> property_myint_; 
}; 

兩個g_object_set_property類初始化處理器可能對您有用參考 GObject properties

所有最好的

+0

感謝您的解釋,我試圖完成在C++中移植代碼,但綁定的相關版本部分不完整,使其只是一團糟! – Gianks