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:
- Its unique name, used to identify the property.
- A human-readable nick name.
- A short description.
- The default value and the minimum and maximum bounds (depending on the type of the property).
- 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_property 和 class_init 处理程序 都可能对您有用 Ref GObject properties
祝一切顺利
我正在尝试使用 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:
- Its unique name, used to identify the property.
- A human-readable nick name.
- A short description.
- The default value and the minimum and maximum bounds (depending on the type of the property).
- 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_property 和 class_init 处理程序 都可能对您有用 Ref GObject properties
祝一切顺利