2016-05-17 9 views
0

私はGLIBMMを使ってC++で一連のGLIBクラスを再実装しようとしています。 それらのほとんどはバグが多く、プロジェクト全体がC++で行われているため、修正する前にコードを移植することをお勧めしました。gblimm/gtkmmカスタムプロパティ

残念ながら私はGLIBのエキスパートではなく、公式のドキュメントの周りに何日も過ごしていても、私はいくつかの概念を理解する上で問題があります。

私が理解している限り、プロパティはセッターとゲッターの完全な置き換え(そして多分)です。基本的には、各属性に特化したメソッドを使用する代わりに、共通のset/get_propertyメソッドを使用して、名前(またはID)でプロパティにアクセスし、GValueのようなコンテナを使用して複数の種類のデータを保持します。

私が見ることのできる唯一の利点は、文字列に含まれている名前(設定ファイルなどから来る可能性があります)にアクセスする機能ですが、確かに何か不足しています。さらに、これはGLIBでは当てはまりますが、Property_set/get_valueの代わりに特殊なプロパティ_(*)getter/setterを使用する必要があるというGlib :: ObjectBaseではそうではありません。

Glib :: Propertyに関するドキュメントを読む私はC++の完全なプロパティ実装が好きであるかどうかは分かりませんが、GLIBでの経験の欠如がそれをより困難にしていると推測します。私はSTDを取得/設定メソッドを持つ属性としてすべてのプロパティを移動したいのですが、私は以前approchが良い回だったと遅すぎる発見多くの変更を加える必要はありません:)

できます

誰かが私にプロパティが何かを説明します(C++クラス属性と比較した場合)?信号/スロットを備えた実用的なプロパティの例を教えてください。誰かが2つの方法の利点についていくつかの光を置くことができますか?

ありがとうございました!

答えて

0

Glibプロパティのフードを見ると、 GObject properties が実装されています。上記のリンクには、コードの詳細な説明もあります。

オブジェクトプロパティ

「のGObjectの素敵な機能の一つは、オブジェクトのプロパティのための一般的な取得/設定メカニズムである。オブジェクトがインスタンス化されると、オブジェクトのclass_initハンドラがg_object_class_install_propertiesと、オブジェクトのプロパティを登録するために使用する必要があります。

C++やCでのより詳細な説明は、両方のリンクで見つけることができます。

オブジェクトのプロパティがどのように機能するかを理解する最良の方法は、トイレでありますそれが使用されている方法の実際の例で王:

我々はGlib Property detailsを見れば、我々は

口が達者な::オブジェクトのプロパティを見ることができます。

は「このクラスは、口が達者な::オブジェクトまたは口が達者な::インターフェイスから派生したクラスで使用するためのGObjectプロパティシステムへC++のAPIを、提供し、GObjectのプロパティをラップします。プロパティを識別するために使用される独自の名前、

  1. プロパティは、各プロパティのタイプといくつかのクラスのデータの各インスタンスに関連付けられた値です。

  2. 人間が読めるニックネームです。
  3. 簡単な説明。
  4. デフォルト値と最小値と最大値の境界(プロパティのタイプによって異なる)。
  5. 国旗、プロパティは読み取りまたは書き込みができるかどうか、とりわけ、定義。」

例参考GObject properties

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

CまたはCでの型定義の等価++ (コンストラクタ/デストラクタ)

テンプレートGlib :: Property < T> :: Property(Glib :: Object &オブジェクト、 constの口が達者な:: &名 をUStringで)

myboolは名前真が既定値

property_mybool(*この、 "mybool"、真)であります(* this、 "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_propertyclass_initハンドブックがあなたに役立つ可能性がありますRef GObject properties

すべて最高の

+0

ありがとう、私はC++でコードの移植を完了しようとしましたが、バインディングの相対バージョンは部分的に不完全で、ちょうど混乱しています! – Gianks

関連する問題