Qt QTreeView редактируемая модель DOM - PullRequest
0 голосов
/ 03 ноября 2011

У меня есть QTreeView, для которого я установил подкласс DomModel: QAbstractItemModel.Каждый элемент является DomItem, который имеет дело главным образом с QDomNode.Я установил QDomDocument для этой модели.Я думаю, что я получил эту систему из одного из примеров Qt.

В ней 3 столбца: 0 для имени узла, 1 для атрибутов и 2 для значения.

В любом случае, я хотелсделать это дерево XML DOM редактируемым.Я изменил некоторые флаги, такие как Qt :: ItemIsEditable и некоторые другие вещи в классе модели, и теперь я могу редактировать модель с помощью QTreeView, дважды щелкнув.

Для столбца 2 это просто, поскольку QDomItem имеет этот setNodeValueФункция, однако я обнаружил, что нет никаких «set» функций для item-> node (). NodeName () и item-> node (). attribute (), которые, я полагаю, изменили бы столбцы 0 и 1.

Так что теперь, когда я изменяю столбец 2, он работает, однако столбцы 0 и 1 возвращаются к своим предыдущим значениям при нажатии enter.

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 Ответ

3 голосов
/ 08 ноября 2011

Ну, очевидно, 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;
}
...