2011-11-03 52 views
0

我有一个QTreeView,我设置了一个子类DomModel:QAbstractItemModel。每个项目都是一个DomItem,主要处理QDomNode。我将QDomDocument设置为此模型。我想我已经从Qt的一个例子中衍生出了这个系统。Qt QTreeView可编辑DOM模型

它有3列:节点名称为0,属性为1,值为2。

无论如何,我想让这个XML DOM树可编辑。我修改了一些标志,例如Qt :: ItemIsEditable和模型类中的其他一些东西,现在我可以通过双击QTreeView来编辑模型。因为QDomItem具有这个setNodeValue函数,但是我发现item-> node()没有“set”函数。NodeName()和item-> node()。attributes() ),我想,修改第0列和第1列。

所以,现在当我修改第2列时,它可以工作,但是列0和列1在回车时恢复到以前的值。

bool DomModel::setData(const QModelIndex &index, const QVariant &value, 
        int role) 
{ 
if (role != Qt::EditRole) return false; 

DomItem *item = static_cast<DomItem*>(index.internalPointer()); 

switch (index.column()){ 
    case 0: 
     // ??? 
     break; 
    case 1: 
     // ??? 
     break; 
    case 2: 
     item->node().setNodeValue(value.toString()); // This works - QTreeView is updated 
     break; 
} 
... 
} 

回答

3

嗯,显然item->node().toElement()它返回一个QDomElement有必要的“set”的功能和它的作品。所以我想我已经找到了一种通过QTreeView完全修改我的XML DOM文件的方法。

这是否把戏对我来说:

switch (index.column()){ 
    case 0: // added 
     item->node().toElement().setTagName(value.toString()); 
     break; 
    case 1: // added 
     // this shall be modified to account for nonstandard spacings, etc. 
     aux = value.toString().trimmed(); 
     aux.remove("\""); 
     attributes.clear(); 
     attributes = aux.split(" "); 
     for(int i = 0; i<attributes.size(); i++){ 
     item->node().toElement().setAttribute(attributes.at(i).split("=").at(0), 
               attributes.at(i).split("=").at(1)); 
     } 
     break; 
    case 2: // Left it as it is 
     item->node().setNodeValue(value.toString()); // This works - QTreeView is updated 
     break; 
}