2016-05-17 37 views
0

Ich versuche, eine Reihe von GLIB-Klassen in C++ mit GLIBMM neu zu implementieren. Die meisten von ihnen sind fehlerhaft und müssen stark erweitert werden, und da das gesamte Projekt in C++ ausgeführt wird, habe ich es vorgezogen, den Code zu portieren, bevor ich ihn korrigiere.gblimm/gtkmm benutzerdefinierte Eigenschaft

Leider bin ich kein GLIB-Experte und selbst wenn ich viele Tage mit der offiziellen Dokumentation verbracht habe, bin ich immer noch in Schwierigkeiten, einige Konzepte zu verstehen, besonders im Bereich Eigenschaften.

Soweit ich verstanden habe, Eigenschaften sind ein vollständiger Ersatz (und vielleicht mehr) für Setter und Getters. Anstatt für jedes Attribut spezielle Methoden zu verwenden, wird für alle eine allgemeine Methode set/get_property verwendet, die auf die Eigenschaft mit einem Namen (oder einer ID) zugreift und einen Container wie GValue verwendet, um mehrere Arten von Daten zu speichern.

Der einzige Vorteil, den ich darin sehen kann, ist die Fähigkeit, auf Eigenschaften mit Namen zuzugreifen, die in Strings enthalten sind (die zum Beispiel aus einer Konfigurationsdatei stammen können), aber ich vermisse etwas. Darüber hinaus scheint dies in GLIB richtig zu sein, aber nicht in Glib :: ObjectBase, was besagt, dass Sie eine spezielle Eigenschaft _ (*) ​​getter/setter anstelle von property_set/get_value bevorzugen sollten.

Die Dokumentation über Glib :: Property lesen Ich bin mir nicht sicher, wie eine vollständige Eigenschaften-Implementierung in C++ aussehen sollte, ich nehme an, die fehlende Erfahrung mit GLIB macht es schwieriger.

Ich mag jede Eigenschaft als Attribut mit std bewegen get/set-Methoden, aber ich will nicht zu spät, eine Menge Veränderungen machen, zu entdecken, dass die bisherige approch war mal besser :)

Can Jemand erklärt mir, was eine Eigenschaft ist (wenn sie mit einem C++ Klassenattribut verglichen wird)? Können Sie mir ein Beispiel für eine funktionierende Eigenschaft mit Signal/Slots geben? Kann jemand die Vorteile der beiden Wege beleuchten?

Vielen Dank!

Antwort

0

Wenn wir unter der Haube von Glib Eigenschaften GObject properties schauen, sehen wir die c Implementierung bei der Arbeit. Der obige Link enthält auch eine detaillierte Erklärung des Codes.

Objekteigenschaften

„Eine nette Features des GObject ist seine generische get/set-Mechanismus für die Objekteigenschaften. Wenn ein Objekt instanziiert wird, die class_init Handler Objekt sollte die Eigenschaften des Objekts mit g_object_class_install_properties registrieren verwendet werden.

Eine detaillierte Erklärung in C++ und C kann sowohl in den Links.

Der beste Weg, um zu verstehen, wie Objekteigenschaften arbeiten, ist von loo König an einem realen Beispiel dafür, wie es verwendet wird:

Wenn wir Glib Property details aussehen können wir

A Glib :: Object-Eigenschaft.

„Diese Klasse wickelt eine GObject Eigenschaft, einen C++ API zum GObject Eigenschaft System, für die Verwendung mit Klassen von Glib abgeleitet :: Object oder Glib :: Schnittstelle.

Eine Eigenschaft ist ein Wert, mit jeder Instanz eines Typs zugeordnet und einige Klassendaten für jede Eigenschaft:

  1. seinen eindeutigen Namen verwendet, um die Eigenschaft zu identifizieren.
  2. Ein gut lesbarer Spitzname.
  3. Eine kurze Beschreibung.
  4. Der Standardwert und die minimalen und maximalen Grenzen (abhängig vom Typ der Eigenschaft).
  5. Flags, die Definition, unter anderem, ob das Objekt gelesen oder geschrieben werden.“

Beispiel Ref GObject properties

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

das Äquivalent von Typdefinition in C oder C++ (Konstruktor/Destruktor)

Vorlage Glib :: Eigenschaft < T> :: Eigenschaft (Glib :: Object & Objekt, const Glib :: ustring & Name )

mybool ist der Name und wahr ist der Standardwert

property_mybool (* this "mybool", true) ,

property_myint_ (* this "myint", 42)

{} 
virtual ~MyCellRenderer() {} 

// Glib :: Property <> können öffentlich sein,

** Erklärung Typkonstruktor/destructor zB öffentliche oder private **

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_; 
}; 

beide g_object_set_property und class_init Handler kann Ihnen von Nutzen sein Ref GObject properties

Alles Gute

+0

Danke für die Erklärung, ich habe versucht, den Code in C++ portieren, aber die relativen Versionen der Bindungen sind teilweise unvollständig, so dass es nur ein Durcheinander! – Gianks