Пользовательское свойство gblimm / gtkmm

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

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

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

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

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

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

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

Спасибо!

0

Решение

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

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

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

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

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

Если мы посмотрим на Glib Недвижимость Подробнее мы можем увидеть

Glib :: Свойство объекта.

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

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

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

Пример Ref GObject свойства

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_ (* this, «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 свойства

Всего наилучшего

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]