Qt4:使“简单Dom模型”可编辑;插入行

时间:2012-02-29 16:01:22

标签: xml qt dom qtreeview

基本上,我想要达到的目标是组合“可编辑树模型”#34;和"简单的Dom模型"例子。所以我将后者作为基础,我已经在那里复制了编辑功能,更改了标记,setData等。

我已经成功编辑了条目。

现在,我在向模型中添加行时遇到了问题。

具体来说,当我在QDomNode::parentNode()中使用insertAfter函数时,模型仅在内部更新。当我折叠并展开父节点时,添加的节点是最后节点的副本并最终插入。

我能够做到正确的唯一方法是将XML保存到QString并再次将其加载到QDomModelQTreeView。然后插入的所有内容都应该是它的位置。但随后所有扩张的国家都失败了!用户不太友好......


InsertAfter版本:

// 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;
}

0 个答案:

没有答案