私は次の奇妙な問題を抱えています。
ツリービューに子ノードを挿入できるように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
ご覧のとおり、「Potato」ノードは正しく挿入されています。
画像を見る 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メソッドを介してノードを直接挿入するのと同じである必要があります。
なぜそれが機能しないのか誰かが知っていることを願っています。
よろしく、マイケル