0

私は次の奇妙な問題を抱えています。

ツリービューに子ノードを挿入できるように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メソッドを介してノードを直接挿入するのと同じである必要があります。

なぜそれが機能しないのか誰かが知っていることを願っています。

よろしく、マイケル

4

1 に答える 1

0

ほとんどすべてが正しいです。この2行だけではありません:

TransformNode *childNode = new TransformNode("insertedNode");
success = parentNode->insertChild(i, childNode);
于 2013-01-05T01:33:37.340 に答える