Пользовательское свойство 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.
Свойство - это значение, связанное с каждым экземпляром типа и некоторыми данными класса для каждого свойства:
- Его уникальное имя, используемое для идентификации имущества.
- Человеческое прозвище.
- Краткое описание
- Значение по умолчанию и минимальные и максимальные границы (в зависимости от типа свойства).
- Флаги, определяющие, среди прочего, может ли свойство быть прочитано или записано."
Пример 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
Всего наилучшего