Qt QTreeView可编辑的DOM模型

时间:2011-11-03 16:59:32

标签: xml qt dom qtreeview qtxml

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

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

无论如何,我想让这个XML DOM树可编辑。我修改了一些标志,如Qt :: ItemIsEditable和模型类中的其他一些东西,现在我可以通过双击来通过QTreeView编辑模型。

对于第2列,它很容易,因为QDomItem有这个setNodeValue函数,但我发现item-> node()没有“set”函数.NodeName()和item-> node()。属性()我认为,修改第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;
}
...
}

1 个答案:

答案 0 :(得分:3)

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

这对我有用:

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;
}