gpt4 book ai didi

c++ - 在 QPlainTextEdit 中获取指向 QTextBlock 的指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:31 27 4
gpt4 key购买 nike

我想在 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) 时,指针后面的对象的属性会按预期更改。这意味着如果您在相关 block 之前插入一行,则 block 号会增加并且几何形状/位置会发生变化。

但是如果您删除相关行(退格/删除),指针仍然指向 QPlainTextEdit 中的 QTextBlock - 我不知道如何或为什么。当我对指针值调用 isValid() 方法时,它返回 true。

那么,为什么属性会改变,虽然它是一个新的 QTextBlock 对象?有没有办法在 QPlainTextEdit 中获取直接指针或对 QTextBlock 的引用?

最佳答案

我知道这是一个老问题,但我在寻找类似问题的解决方案时偶然发现了它,所以我正在回答记录我发现的可能与 future 搜索相关的内容。

我试图附加一些外部标记以绑定(bind)到特定行,即使在编辑插入/删除其他行时也是如此。问题是,即使删除了附加到标记的行, block 对象也被重新使用,因此标记被移到了错误的位置。

解决方案是使用文本 block 的用户数据功能。当一个 block 被“删除”并重新使用时,用户数据将被删除。所以我的标记继承自 QTextBlockUserData 并且我将标记设置为 block 的用户数据,并在标记中保存对 block 的引用。然后,有效性测试就是简单地比较标记对象和区 block 持有的用户数据。似乎有效。

关于c++ - 在 QPlainTextEdit 中获取指向 QTextBlock 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8341736/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com