获取QPlainTextEdit中指向QTextBlock的指针

Get pointer to QTextBlock in QPlainTextEdit

本文关键字:QTextBlock 指针 QPlainTextEdit 获取      更新时间:2023-10-16

我想在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,我将标记设置为块的用户数据,并在标记中保存对块的引用。然后,有效性测试只是比较标记对象和块持有的用户数据。