У меня есть 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;
}
...
}