QTreeView insertRows通过方法压碎/直接调用工作

时间:2013-01-04 10:06:55

标签: c++ qt treeview qabstractitemmodel

我有以下奇怪的问题。

我已经实现了一个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节点,它就会崩溃。但请查看上面代码中的最后一条评论。正如我所提到的 - &gt;如果我现在尝试输出树视图(它遍历所有节点)它会崩溃。

当调用该方法时,一切似乎都没问题 - 就在我尝试消耗树视图时崩溃 - &gt;调试输出让我觉得一切都应该没问题

实际的错误信息是在阅读位置时的访问冲突...(翻译自德语 - 不知道它的英文名称是否相同)

 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方法直接插入节点基本相同。

我希望有人知道为什么它不起作用。

最好的问候,迈克尔

1 个答案:

答案 0 :(得分:0)

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

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