0

我正在尝试使用 GLIBMM 在 C++ 中重新实现一组 GLIB 类。它们中的大多数都是错误的,需要大量扩展,并且由于整个项目都是用 C++ 完成的,我更喜欢在更正之前移植代码。

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

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

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

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

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

有人可以解释一下什么是属性(如果与 C++ 类属性相比)?你能给我一个带有信号/插槽的工作属性的例子吗?有人可以说明这两种方式的优点吗?

谢谢!

4

1 回答 1

0

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

对象属性

“GObject 的一个很好的特性是它对对象属性的通用获取/设置机制。当一个对象被实例化时,应该使用对象的 class_init 处理程序将对象的属性注册到 g_object_class_install_properties。

可以在两个链接中找到 C++ 和 C 的更详细说明。

了解对象属性如何工作的最好方法是查看一个如何使用它的真实示例:

如果我们查看Glib 属性详细信息,我们可以看到

一个Glib::Object 属性。

“这个类包装了一个 GObject 属性,为 GObject 属性系统提供了一个C++ API,用于从 Glib::Object 或 Glib::Interface 派生的类。

属性是与类型的每个实例和每个属性的一些类数据相关联的值:

  1. 其唯一名称,用于标识属性。
  2. 人类可读的昵称。
  3. 简短的描述。
  4. 默认值以及最小和最大界限(取决于属性的类型)。
  5. 标志,除其他外,定义属性是否可以读取或写入。”

示例参考GObject 属性

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

C 或 C++ 中类型定义的等价物(构造函数/析构函数)

模板 Glib::Property<T>::Property (Glib::Object& 对象, const Glib::ustring& 名称)

mybool 是名称true 是默认值

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

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_propertyclass_init 处理程序都可能对您有用 Ref GObject 属性

祝一切顺利

于 2016-05-25T14:43:32.047 回答