【转】初探ogitor中的属性窗口 - 野猪的日志 - 网易博客

初探ogitor中的属性窗口

 

      在Qt中实现自己的属性窗口时,总觉得挺繁杂的,便看看ogitor中是如何实现的。

      大致看下,道道也不少,一些数据结构,只列出主要成员

class PropertyOption {Ogre::String mKey;Ogre::String mValue;};

class PropertyOptionsVector {std::vector<PropertyOption>;};

class OgitorsPropertyDef {OgitorsPropertyType mType;PropertyOptionsVector* mOptions;};

class OgitorsPropertyDefMap {std::map<Ogre::String,OgitorsPropertyDef>;};

class OgitorsPropertyBase {OgitorsPropertyDef* mDef;OgitorsSignal mSignal;

           OgitorsScopedConnection mConnection;};

class OgitorsSignal {bool mConnected;vector<connect_data*> mConnections;};

struct connect_data {OgitorsSignalFunction function;int ref_count;bool connected;};

class OgitorsSignalFunction {void* object_ptr;

                                                         void(*stub_ptr)(void*,const OgitorsPropertyBase*,Ogre::Any);};

class OgitorsConnection {connection_data *mData;};

class OgitorsScopedConnection {public OgitorsConnection;};

      template<typename T>OgitorsProperty:public OgitorsPropertyBase

                                          {PropertySetterFunction<T> *mSetter;T mValue;T mOldValue;};

class OgitorsPropertySet {OgitorsPropertyMap mPropertyMap;

                                                    OgitorsPropertyVector mPropertyVector;

                                                    ScopedConnectionVector mPropertyConnections;};

      挺多的,哥哥第一次看头晕,再看头晕依旧,再看看看懂点的,好 ,明天继续

      话说这天,哥看得比较明白。

      在Qt GUI方面,属性窗口不包含在Qt设计师里,需去Qt官网下载,google一下QtProperty应该就有结果,下载(里面还有好些使用例子),编译通过,得到一些lib和dll文件,当然还有些头文件,在VC源码中直接#include<>相应的头文件,就可使用。

      主要就是QtTreePropertyBrowser这个类,ogitor中包装下:

      class GeneralTreeBrowser:public QtTreePropertyBrowser {};

      class GeneralPropertiesViewWidget:public QWidget,public OgitorsPropertySetListener

      {GeneralTreeBrowser* propertiesWidget;QtIntPropertyManager* intManager;

QtToOgitorPropertyMap mQtToOgitorPropertyMap;

       OgitorToQtProperMap mOgitorToQtPropertyMap;};最后两个成员是Qt GUI和ogitor的映射。

       在GeneralPropertiesViewWidget构造函数中,生成各种QtAbstractPropertyManager实例,各种对应的QtAbstractEditorFactory实例;随后new GeneralTreeBrowser()并调用其setFactoryForManager()函数把Manager和Factory联系起来,具体见propertiesviewgeneral.cpp文件中的类构造函数。

       最前面介绍的那些类怎么用的呢,答案是在CBaseEditor中,在ogitor中,主要的逻辑和功能是放在ogitor工程中的,而其中的大部分都继承自CBaseEditor中,以CTerrainGroupEditor为例:

      class  CTerrainGroupEditor:public CBaseEditor {};

      在该类中,包含有各种OgitorsProperty<>的成员指针变量,在其构造函数中会生成相应实例。这样,通过CBaseEditor,就可以显示该功能部件的属性了,同时,也可通过改变属性来更新逻辑功能类,可以看看:

void GeneralPropertiesViewWidget::DisplayObjectProperties(CBaseEditor* object){}

       当我们在ogitor中的场景列表中选中某个对象(CBaseEditor*中派生类)时,属性窗口就会更新其内容。当通过属性窗口改变相应属性值时,通过映射(这里是QtProperty*到OgirotsProperty<>*)找到OgitorsProperty<>*,执行更新逻辑。

       基本上就是这样,有点繁琐,说的可能不太明白,建议结合ogitor源代码看,等我在自己项目中运用后,再总结总结心得

       最后,感谢那首歌,写的时候听的,还不错《谁动了我的琴弦》

初探ogitor中的属性窗口 - 野猪的日志 - 网易博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值