2013-01-04 54 views
0

我有以下奇怪的問題。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方法直接插入節點相同。

我希望有人知道爲什麼它不起作用。

此致敬禮邁克爾

+0

由於您的模型已損壞,請使用QModelTester – paulm

回答

0

幾乎一切都是正確的。只是這兩行不是:

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