QModelIndex TextDocumentStructureModel::parent(const QModelIndex &index) const { kDebug(32500) << "-------------------------- index:"<<index<<m_textDocument; if (! m_textDocument || ! index.isValid()) { return QModelIndex(); } Q_ASSERT(index.internalId() < uint(m_nodeDataTable.count())); const NodeData &nodeData = m_nodeDataTable.at(index.internalId()); QTextFrame* parentFrame; if (nodeData.type == NodeData::Frame) { parentFrame = nodeData.frame->parentFrame(); } else { QTextBlock block = m_textDocument->findBlockByNumber(nodeData.blockNumber); Q_ASSERT(block.isValid()); // QTextBlock's API has no option to query the parentframe, so get it via a cursor QTextCursor cursor(block); parentFrame = cursor.currentFrame(); } if (! parentFrame) { return QModelIndex(); } QTextFrame* grandParentFrame = parentFrame->parentFrame(); // parent is root frame? if (! grandParentFrame) { Q_ASSERT(parentFrame == m_textDocument->rootFrame()); return createIndex(0, 0, static_cast<quintptr>(0)); } // find position of parentFrame bool posFound = false; int row = 0; for (QTextFrame::iterator iterator = grandParentFrame->begin(); !iterator.atEnd(); ++iterator) { if (iterator.currentFrame() == parentFrame) { posFound = true; break; } ++row; } Q_ASSERT(posFound);Q_UNUSED(posFound); return createIndex(row, 0, frameIndex(parentFrame)); }