我有以下奇怪的問題。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方法直接插入節點相同。
我希望有人知道爲什麼它不起作用。
此致敬禮邁克爾
由於您的模型已損壞,請使用QModelTester – paulm