2016-05-17 5 views
0

Я пытаюсь переопределить набор классов GLIB в C++ с использованием GLIBMM. Большинство из них багги и их нужно много расширять, и поскольку весь проект выполнен на C++, я предпочитаю переносить код, прежде чем исправлять его.gblimm/gtkmm custom property

К сожалению, я не эксперт GLIB, и даже если я провел много дней вокруг официальной документации, я все еще испытываю трудности в понимании некоторых концепций, особенно вокруг свойств.

Насколько я понял, свойства являются полной заменой (и, возможно, более) для сеттеров и геттеров. В принципе, вместо использования специализированных методов для каждого атрибута для всех из них используется общий метод set/get_property, доступ к свойству с именем (или идентификатором) и использование контейнера типа GValue для хранения нескольких типов данных.

Единственное преимущество, которое я вижу в этом, - это возможность доступа к свойствам с именами, содержащимися в строках (которые могут возникнуть, например, из файла конфигурации), но я, несомненно, что-то пропустил. Более того, это похоже на GLIB, но не в Glib :: ObjectBase, в котором говорится, что вы предпочитаете специализированное свойство _ (*) ​​getter/setter вместо property_set/get_value.

Чтение документации о Glib :: Свойство Я не знаю, как должна выглядеть полная реализация свойств на C++, я полагаю, что отсутствие опыта работы с GLIB затрудняет ее работу.

Я хотел бы переместить каждое свойство как атрибут с стандом получить методы/набора, но я не хочу, чтобы сделать много изменений обнаруживая слишком поздно, что предыдущий Approch был раз лучше :)

Может кто-то объясняет мне, что такое свойство (по сравнению с атрибутом класса C++)? Можете ли вы предоставить мне пример рабочего свойства с сигналом/слотом? Может ли кто-нибудь рассказать о преимуществах двух способов?

Спасибо!

ответ

0

Если мы посмотрим под капотом свойств Glib GObject properties , мы видим реализацию c на работе. Вышеупомянутая ссылка также содержит подробное объяснение кода.

Свойство объекта

«Одна из приятных особенностей GObject является его родовым получить/установить механизм свойства объекта. При создании экземпляра объекта, обработчик class_init объекта следует использовать для регистрации свойств объекта с g_object_class_install_properties.

более подробно объясняется в C++ и C можно найти в обеих ссылках.

лучший способ понять, как работают свойства объекта является Лоо король на реальный пример того, как оно используется:

Если мы посмотрим на Glib Property details мы можем увидеть

свойство Glib :: Object.

«Этот класс оборачивает свойство GObject, обеспечивая C++ API к системе свойств GObject, для использования с классами, полученными из Glib :: Object или Glib :: Интерфейс.

Свойство имеет значение, связанное с каждым экземпляром типа и некоторые данные класса для каждого свойства:

  1. Его уникальное имя, используемое для идентификации имущества.
  2. Человеко-читаемый псевдоним.
  3. Краткое описание.
  4. Значение по умолчанию и минимальная и максимальная границы (в зависимости от типа свойства).
  5. Флаги, определяющие, среди прочего, является ли свойство может быть считан или записан.»

Пример Ссылка GObject properties

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

Эквивалентная определения типа в C или C++ (Конструктор/Деструктор)

Шаблон Glib :: Свойство < T> :: Свойство (Glib :: Object)объект, Const Glib :: ustring & имя )

mybool это имя и истинное значение по умолчанию

property_mybool (* это, "mybool", правда) ,

property_myint_ (* это, "Мьин", 42)

{} 
virtual ~MyCellRenderer() {} 

// Glib :: Недвижимость <> может быть публичным,

** Декларация типа конструктора/деструктора например, общественные или частные **

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 и class_init обработчик может быть вам полезен Ref GObject properties

Все самое лучшее

+0

Спасибо за объяснение, я попытался завершить перенос кода на C++, но относительные версии привязок частично неполны, что делает его просто беспорядок! – Gianks

Смежные вопросы