基本上,我想要实现的是结合“可编辑树模型”和“简单 Dom 模型”示例。因此,我以后者为基础,并在那里复制了编辑功能,更改了标志setData
等。
我已经在编辑条目方面取得了成功。
现在,我在向模型添加行时遇到了问题。
具体来说,当我在中使用 insertAfter 函数时QDomNode::parentNode()
,模型只会在内部更新。当我折叠和展开父节点时,添加的节点是最后一个节点的副本并插入到最后。
我能够正确处理的唯一方法是将 XML 保存到QString
并再次将其加载到QDomModel
andQTreeView
中。然后所有插入的东西都在它应该在的地方。但是随后所有扩展状态都丢失了!不是很人性化...
插入后版本:
// Get current index
QModelIndex currentTreeIdx = ui->treeView->selectionModel()->currentIndex();
// Get the node corresponding to that index
DomItem *itemRef = static_cast(currentTreeIdx.internalPointer());
QDomElement newParentTag;
QDomElement newTextTag;
QDomText newText;
// Create tags
newParentTag = model->domDocument.createElement("Parent");
newTextTag = model->domDocument.createElement("Child");
newText = model->domDocument.createTextNode("Child text data");
newTextTag.appendChild(newText);
newSubtitleTag.appendChild(newTextTag);
// Attempt to insert a new tag after the currently selected item
itemRef->node().parentNode().insertAfter(newParentTag, itemRef->node());
现在,我尝试添加这样的行而不是insertAfter
:
model->insertRows(itemRef->row(), 1, currentTreeIdx.parent());
被调用的函数是:
bool DomModel::insertRows(int position, int rows, const QModelIndex &parent){
DomItem *parentItem = static_cast<DomItem*>(parent.internalPointer()); // reference item
bool success;
beginInsertRows(parent, position, position + rows - 1);
success = parentItem->insertChildren(position, rows, 4);
endInsertRows();
return success;
}
这个应该创建一行。它确实创建了一个不可见的父级,我可以单击它来展开。但是这个父级现在包含整个模型的副本......
我的 insertChildren 函数似乎有问题。就像现在一样,它将当前选定的行替换为空行。
bool DomItem::insertChildren(int position, int count, int columns){
if (position < 0 || position > childItems.size()){
return false;
}
for (int row = 0; row < count; row++){
DomItem *item = new DomItem(*(new QDomNode()), row, this); // this doesn't seem to be correct...
childItems.insert(position, item);
}
return true;
}