获取QPlainTextEdit中指向QTextBlock的指针
Get pointer to QTextBlock in QPlainTextEdit
我想在QMap对象中映射两个指针以存储它们的关系。键指针指向QTextBlock,而值指针指向小部件。目的是在QPlainTextEdit中的某些内容发生变化时,更新小部件相对于QTextBlock在QPlainTextEdit中的位置的位置。当QTextBlock被销毁时,小部件应该被销毁。
然而,我不熟悉QTextBlock在QPlainTextEdit中的行为。虽然firstVisibleBlock()方法似乎没有返回指向QPlainTextEdit中的QTextBlock的指针,但我创建了一个新的QTextBlock,其中QPlainTextEdit中的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);
}
好吧,这似乎是有效的,因为当我添加新的行(QTextBlocks)到QPlainTextEdit通过点击Enter/返回指针后面的对象的属性改变预期。这意味着如果你在相关块之前插入一行,blockNumber会增加,几何体/位置也会改变。
但是如果你删除相关行(退格/del)的指针仍然指向QTextBlock在QPlainTextEdit -我不知道如何或为什么。当我在指针值上调用isValid()方法时,它返回true。
那么,为什么属性改变,虽然它是一个新的QTextBlock对象?是否有一种方法可以在QPlainTextEdit中获得一个直接指针或对QTextBlock的引用?
我知道这是一个古老的问题,但是我在寻找类似问题的解决方案时偶然发现了它,所以我回答它是为了记录我发现的可能与未来搜索相关的内容。
我试图附加一些外部标记,即使在编辑插入/删除其他行时也要绑定到特定行。问题是,即使连接到标记的行被删除,块对象被重用,因此标记被移动到错误的位置。
解决方案是使用文本块的用户数据特征。当一个块被"删除"和重用时,用户数据被删除。因此,我的标记继承自QTextBlockUserData
,我将标记设置为块的用户数据,并在标记中保存对块的引用。然后,有效性测试只是比较标记对象和块持有的用户数据。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 获取QPlainTextEdit中指向QTextBlock的指针