我想在 QMap 对象中映射两个指针来存储它们的关系。键指针指向 QTextBlock,而值指针指向小部件。目的是当 QPlainTextEdit 中的某些内容发生更改时,更新小部件相对于 QPlainTextEdit 中 QTextBlock 的位置的位置。当 QTextBlock 被破坏时,小部件应该被破坏。
但是,我不熟悉 QPlainTextEdit 中 QTextBlock 的行为。虽然 firstVisibleBlock() 方法似乎没有返回指向 QPlainTextEdit 中的 QTextBlock 的指针,但我使用 QPlainTextEdit 中的 QTextBlock 作为参数创建了一个新的 QTextBlock。
QTextBlock* CodeEditor::getBlockAtPosition(QPoint position) {
QTextBlock block = firstVisibleBlock();
while (true)
{
QRectF blockDim = blockBoundingGeometry(block).translated(contentOffset());
if (position.y() <= blockDim.bottom() && position.y() >= blockDim.top())
{
break;
}
else if (block.blockNumber() + 1 < blockCount())
block = block.next();
else break;
}
return new QTextBlock (block);
}
好吧,这似乎可行,因为当我通过按 Enter/Return 向 QPlainTextEdit 添加新行(QTextBlocks)时,指针后面的对象的属性会按预期更改。这意味着如果您在相关块之前插入一行,blockNumber 会增加并且几何/位置会发生变化。
但是,如果您删除相关行(退格/删除),指针仍然指向 QPlainTextEdit 中的 QTextBlock - 我不知道如何或为什么。当我对指针值调用 isValid() 方法时,它返回 true。
那么,为什么属性会发生变化,但它是一个新的 QTextBlock 对象?有没有办法在 QPlainTextEdit 中获取直接指针或对 QTextBlock 的引用?