2016-05-17 24 views
0

我想重新实现一组使用GLIBMM的C++ GLIB类。 其中大多数是bug,需要扩展很多,因为整个项目都是用C++完成的,所以在更正它之前,我首选移植代码。gblimm/gtkmm自定义属性

不幸的是,我不是GLIB的专家,即使我在官方文档上花费了很多天,我仍然在理解一些概念方面遇到麻烦,特别是在属性周围。

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

我能看到的唯一好处是能够访问包含在字符串中的名称的属性(可能来自配置文件),但我肯定错过了一些东西。此外,这在GLIB中似乎是正确的,但在Glib :: ObjectBase中并不是这样,它表示您应该更喜欢使用专用属性_(*)getter/setter而不是property_set/get_value。

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

我想每个属性移动与性病属性get/set方法,但我不想做了很大的改动发现为时已晚,以前的计算策略是更好的时代:)

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

谢谢!

回答

0

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

对象属性

“其中一个GObject的不错的功能是它的通用get/set方法的对象属性的机制。当一个对象被实例化,对象的类初始化处理程序应该使用g_object_class_install_properties登记对象的属性。

C中的一个更详细的解释++和C可以在两个环节上找到。

的最佳方式,了解对象属性是如何工作的是厕所在它是如何使用的一个真实的例子国王:

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

一个油嘴::对象属性。

“这类包装一个图形对象属性,提供C++ API到图形对象属性的系统,使用与从油嘴::对象或油嘴::接口派生类。

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

  1. 其独特的名称,用于识别属性。
  2. 一个可读的昵称。
  3. 简短说明。
  4. 默认值以及最小和最大范围(取决于属性的类型)。
  5. 旗,限定,除其他事项外,该属性是否可以被读取或写入。”

实施例参考GObject properties

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

类型定义的C或C等效++ (Constructor/Destructor)

Template Glib :: Property < T :: :: Property(Glib :: Object &对象, 常量油嘴:: ustring &名 )

mybool是名真正为默认值

property_mybool(*此, “mybool”,真) ,

property_myint_(*此, “敏”,42)

{} 
virtual ~MyCellRenderer() {} 

//油嘴::物业<>可以是公开的,

**类的构造函数/析构函数如公共声明或私人**

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类初始化处理器可能对您有用参考 GObject properties

所有最好的

+0

感谢您的解释,我试图完成在C++中移植代码,但绑定的相关版本部分不完整,使其只是一团糟! – Gianks