我想在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键或按预期返回指针后面的对象的属性将新行(QTextBlocks)添加到QPlainTextEdit时。这意味着,如果您在相关块之前插入一行,则blockNumber会增加,几何形状/位置也会改变。

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

那么,为什么属性是新的QTextBlock对象却发生了变化?有没有办法在QPlainTextEdit中获得直接指针或对QTextBlock的引用?

最佳答案

我知道这是一个古老的问题,但是在寻找类似问题的解决方案时我偶然发现了这个问题,因此我要记录我发现的与将来搜索有关的内容。

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

解决方案是使用文本块的用户数据功能。当块被“删除”并重新使用时,用户数据将被删除。因此,我的标记继承自QTextBlockUserData,我将标记设置为该块的用户数据,并在标记中保留对该块的引用。
然后,有效性测试仅是比较标记对象和该块保存的用户数据。似乎可以工作。

08-06 14:04