初探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中的属性窗口 - 野猪的日志 - 网易博客
最新推荐文章于 2023-04-25 23:34:43 发布