glibmm/gtkmm 自定义 属性 explanation/example 请求

glibmm/gtkmm custom property explanation/example request

我正在尝试使用 GLIBMM 在 C++ 中重新实现一组 GLIB classes。 他们中的大多数都有问题,需要大量扩展,因为整个项目都是用 C++ 完成的,所以我更喜欢在更正之前移植代码。

不幸的是,我不是 GLIB 专家,即使我花了很多天时间阅读官方文档,我仍然难以理解一些概念,尤其是关于属性的概念。

据我所知,属性是 setter 和 getter 的完全替代品(也许更多)。基本上,不是为每个属性使用专门的方法,而是对所有属性使用通用的 set/get_property 方法,使用名称(或 ID)访问 属性 并使用像 GValue 这样的容器来保存多种类型数据。

我在这方面看到的唯一优势是能够访问名称包含在字符串中的属性(例如,可能来自配置文件),但我肯定遗漏了一些东西。此外,这在 GLIB 中似乎是正确的,但在 Glib::ObjectBase 中却不是,它表示您应该更喜欢专门的 属性_(*) getter/setter 而不是 property_set/get_value.

正在阅读有关 Glib::Property 的文档,我不确定 C++ 中的完整属性实现应该如何,我认为缺乏 GLIB 经验会使它变得更难。

我想将每个 属性 作为一个属性移动到 std get/set 方法,但我不想做很多更改,但发现太晚了,以前的方法更好:)

谁能给我解释一下 属性 是什么(如果与 C++ class 属性相比)?你能给我一个 属性 和 signal/slots 一起工作的例子吗?有人可以阐明这两种方式的优点吗?

谢谢!

如果我们深入了解 Glib 属性 GObject properties 我们看到 c 实现在工作。上面link也有代码的详细解释。

Object properties

"One of GObject's nice features is its generic get/set mechanism for object properties. When an object is instantiated, the object's class_init handler should be used to register the object's properties with g_object_class_install_properties.

可以在 link 中找到 C++ 和 C 的更详细解释。

了解对象属性如何工作的最佳方法是查看其使用方式的真实示例:

如果我们看一下 Glib Property details 我们可以看到

A Glib::Object property.

"This class wraps a GObject property, providing a C++ API to the GObject property system, for use with classes derived from Glib::Object or Glib::Interface.

A property is a value associated with each instance of a type and some class data for each property:

  1. Its unique name, used to identify the property.
  2. A human-readable nick name.
  3. A short description.
  4. The default value and the minimum and maximum bounds (depending on the type of the property).
  5. Flags, defining, among other things, whether the property can be read or written."

示例参考 GObject properties

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

The Equivalent of type definition in C or C++ (Constructor / Destructor)

Template Glib::Property< T >::Property ( Glib::Object& object, const Glib::ustring& name )

mybool 是名称true 是默认值

property_mybool (*this, "mybool", true),

property_myint_ (*this, "myint", 42)

{}
virtual ~MyCellRenderer() {}

// Glib::Property<> 可以是 public,

** 类型构造函数/析构函数的声明 例如 Public 或 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_;
};

g_object_set_propertyclass_init 处理程序 都可能对您有用 Ref GObject properties

祝一切顺利