Qt4: Создание редактируемой "Simple Dom Model"; вставка строк - PullRequest
1 голос
/ 29 февраля 2012

По сути, я пытаюсь объединить примеры «Редактируемая модель дерева» и «Простая модель домена».Таким образом, я использую последнее в качестве основы и скопировал туда функции редактирования, изменил флаги, setData и т. Д.

У меня уже был успех при редактировании записей.

Теперь у меня проблема с добавлением строк в модель.

В частности, когда я использую функцию insertAfter в QDomNode::parentNode(), модель обновляется только внутри.Когда я сверну и разверну родительский узел, добавленные узлы являются копиями последних узлов и вставляются в конце.

Единственный способ, которым я могу сделать это правильно, - сохранить XML в QStringи снова загрузите его в QDomModel и QTreeView.Тогда все, что было вставлено, находится там, где и должно быть.Но тогда все расширенные состояния потеряны!Не очень удобно ...


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