Пользовательское свойство 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++)? Можете ли вы дать мне пример рабочего свойства с сигналом / слотами? Может ли кто-то осветить преимущества двух способов?

Спасибо!

1 ответ

Решение

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

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

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

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

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

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

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

"Этот класс оборачивает свойство GObject, предоставляя API C++ для системы свойств 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::Property ::Property ( Glib:: Объект и объект, const Glib:: ustring & name)

mybool - это имя, а true - значение по умолчанию.

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

property_myint_ (* this, "myint", 42)

{}
virtual ~MyCellRenderer() {}

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

** Объявление типа конструктор / деструктор Например, открытый или закрытый **

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

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

Другие вопросы по тегам