三维场景的数据组织结构基本都是树状,一个工程,按照图层分组,然后在组别内添加对应的图层。如果场景层次较少,则在工程初始时,默认的树列表空间可以展示场景结构,但是如果场景层次复杂,则需要拖动滚动条或者折叠Group实现。再次需求的基础上,修改项目的场景树,为Group添加Expand属性,为图层Layer添加Vislble属性,在新打开工程时,能够按需打开上次保存的场景层次。
任务分两部分:
1.Group添加Expand 2.Layer添加Vislble
1.Group添加Expand
第一个问题是在哪里添加属性,因为项目的配置主要是xml的config文件实现,肯定需要修改项目的config配置。本项目的xml的结构组织跟实际的osg场景数据组织一致。主要分为两类组属性和层属性。显然Expand需要对组属性添加。实现的思路是GroupConfig类添加expand属性,默认为展开。添加的过程就是在xml文件遍历时根据Group的expand写入xml文件中,保存。在系统界面中对Tree列表操作时,根据item的check状态改变的槽函数updata工程xml文件的config。
根据上述思路,实现函数也就清晰了,在Tree控件中添加expand和collapse槽函数,改变Group的visible属性。然后在xml的管理类GroupConfig中写出改变的状态。
函数一:记录expand状态
1 void doItemExpand( QTreeWidgetItem* item ) 2 { 3 //根据item判断是否为Group节点 4 LayerGroupTreeItem *layerGroupTreeItem = dynamic_cast<LayerGroupTreeItem*>(item); 5 if (layerGroupTreeItem) 6 { 7 //获取该item的GroupConfig,设置其expand属性 8 layerGroupTreeItem->getLayerGroup()->setExpandState(true); 9 } 10 }
函数二:记录collapse状态
1 void doItemCollapse( QTreeWidgetItem* item ) 2 { 3 LayerGroupTreeItem *layerGroupTreeItem = dynamic_cast<LayerGroupTreeItem*>(item); 4 if (layerGroupTreeItem) 5 { 6 layerGroupTreeItem->getLayerGroup()->setExpandState(false); 7 } 8 9 }
函数三:写入xml文件
1 if (LayerConf.key()== "group") 2 { 3 LayerGroupConfig* layerGroupconfig = new LayerGroupConfig(LayerConf); 4 //test 获取每个group节点的展开状态 5 std::string expandstate; 6 LayerConf.getIfSet("expandstate",expandstate); 7 if (expandstate == "true") 8 { 9 layerGroupconfig->setExpandState(true); 10 }else 11 { 12 layerGroupconfig->setExpandState(false); 13 } 14 _layerGroupConfig.push_back(layerGroupconfig); 15
这样就实现了写入,写出,更新状态。在使用中只要遍历树判断Group的属性,即可实现状态可控。
浙公网安备 33010602011771号