0

我有以下奇怪的问题。

我已经实现了一个 QAbstractItemModel,以至于我可以将子节点插入到树视图中,但是当我尝试通过 insertRows() 方法添加节点时会发生一些奇怪的事情。

首先调用 all 的地方:

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

几乎一切都是正确的。只是这两行不是:

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