0

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

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

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

对于第 2 列,这很容易,因为 QDomItem 有这个 setNodeValue 函数,但是我发现 item->node().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;
}
...
}
4

1 回答 1

3

好吧,显然item->node().toElement()它返回 aQDomElement具有必要的 " 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;
}
于 2011-11-08T16:53:31.647 回答