0

サブクラス化されたDomModel:QAbstractItemModelを設定するQTreeViewがあります。各アイテムは、主にQDomNodeを処理するDomItemです。QDomDocumentをこのモデルに設定しました。このシステムは、Qtの例の1つから派生したと思います。

3つの列があります。0はノード名、1は属性、2は値です。

とにかく、私はこのXMLDOMツリーを編集可能にしたかったのです。Qt :: ItemIsEditableやモデルクラスの他のいくつかのフラグを変更しました。これで、ダブルクリックしてQTreeViewからモデルを編集できます。

列2の場合、QDomItemにはこのsetNodeValue関数があるため簡単ですが、item-> node()。NodeName()およびitem-> node()。attributes()には「set」関数がないことがわかりました。私は、列0と1を変更すると推測します。

したがって、列2を変更すると機能しますが、Enterキーを押すと、列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()aを返すものに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;
}
于 2011-11-08T16:53:31.647 に答える