QTreeView insertRows через метод раздавливания / прямой вызов работает

У меня следующая странная проблема.

Я реализовал QAbstractItemModel до такой степени, что я могу вставить дочерние узлы в древовидное представление, но происходит нечто странное, когда я пытаюсь добавить узлы с помощью метода insertRows ().

Первый, где все называется:

QApplication a(argc, argv);

QResource::registerResource("Qt5Tutorial.rcc");

QTreeView *treeView = new QTreeView();
treeView->show();

Node rootNode("rootNode");
CameraNode childNode0("childNode0", &rootNode);
CameraNode childNode1("childNode1", &rootNode);
LightNode childNode2("childNode2", &rootNode);
CameraNode childNode3("childNode3", &childNode0);
TransformNode childNode4("childNode4", &childNode2);
TransformNode tryNode("potato");

// setup model
ObjectTreeModel model(&rootNode);
treeView->setModel(&model);

// insert directly via the insert child method
// this works!
childNode0.insertChild(1, &tryNode);

// get the QModelIndex of childNode1
// must be passed in the insertRows() method
QModelIndex index(model.index(1, 0, QModelIndex()));

// the output is "childNode1" what is totally right
qDebug() << "index: "<<static_cast<Node*>(index.internalPointer())->getName();

// output see posted beneath
qDebug() << rootNode.log();

// should insert in "childNode1" -> at 0th position and just 1 Node object
// see the method beneath
model.insertRows(0, 1, index);

// if i try to call the method rootNode.log(); now again, it crashes

return a.exec();

Это результат вызова rootNode.log ():

---rootNode
---childNode0
---childNode3
---potato
---childNode1
---childNode2
---childNode4

Как видите, узел «Картошка» правильно вставлен.

Посмотреть изображение
http://www10.pic-upload.de/04.01.13/m65huuqq4ruu.png

Но как только я пытаюсь развернуть узел childNode1, он падает. Но посмотрите на последний комментарий в коде выше. Как я уже говорил -> если я пытаюсь вывести древовидное представление сейчас (оно перебирает все узлы), то происходит сбой.

Когда метод вызывается, кажется, что все в порядке — просто когда я пытаюсь использовать дерево, он вылетает -> вывод отладки позволяет мне думать, что все должно быть в порядке

Фактическое сообщение об ошибке является нарушением прав доступа при чтении в позиции … (в переводе с немецкого — не знаю, называется ли оно так же на английском)

 bool ObjectTreeModel::insertRows(int position, int row, const QModelIndex &parent)
{
beginInsertRows(parent, position, position + row - 1);

Node *parentNode = getNode(parent);
qDebug() << "parentName: " << parentNode->getName();

bool success = false;
for(int i = position; i < row; i++)
{

qDebug() << "inside loop";
qDebug() << "position: " << position << "row: " << row;

TransformNode childNode("insertedNode");
success = parentNode->insertChild(i, &childNode);

qDebug() << "success: " << success;
}

endInsertRows();

return success;

}

Отладочный вывод для метода выше:

getNode: successful
parentName: "childNode1"inside loop
position:  0 row:  1
called inserchild
success:  true

Я понятия не имею, почему это происходит, потому что выходные данные отладки кажутся правильными, и они должны быть в основном такими же, как вставка узла напрямую через метод insertChild.

Я надеюсь, что у кого-то есть идея, почему это не работает.

С наилучшими пожеланиями, Майкл

0

Решение

Почти все правильно. Просто этих двух строк нет:

TransformNode *childNode = new TransformNode("insertedNode");
success = parentNode->insertChild(i, childNode);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]