我想在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会增加,几何/位置会发生变化。
但是如果删除相关的行(退格/ del),指针仍指向QPlainTextEdit中的QTextBlock - 我不知道如何或为什么。当我在指针值上调用isValid()方法时,它返回true。
那么,为什么属性会改变,因为它是一个新的QTextBlock对象?有没有办法在QPlainTextEdit中获得直接指针或对QTextBlock的引用?
答案 0 :(得分:0)
我知道这是一个老问题,但我在寻找类似问题的解决方案时偶然发现它,所以我正在回答记录我发现的可能与未来搜索相关的内容。
即使在编辑插入/删除其他行时,我也试图附加一些外部标记以绑定到特定行。问题是即使删除了连接到标记的线,也会重复使用块对象,因此标记移动到错误的位置。
解决方案是使用文本块的用户数据功能。当块被“删除”并重新使用时,将删除用户数据。所以我的标记继承自QTextBlockUserData
,我将标记设置为块的用户数据,并在标记中保存对块的引用。
然后,有效性测试只是比较标记对象和块所拥有的用户数据。似乎工作。