在 QPlainTextEdit 中获取指向 QTextBlock 的指针

Posted

技术标签:

【中文标题】在 QPlainTextEdit 中获取指向 QTextBlock 的指针【英文标题】:Get pointer to QTextBlock in QPlainTextEdit 【发布时间】:2011-12-01 12:54:51 【问题描述】:

我想在 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 会增加并且几何/位置会发生变化。

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

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

【问题讨论】:

您是否尝试在“悬空” QTextBlock 中插入文本()?你检查 QTextBlock::isVisible 属性了吗? 【参考方案1】:

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

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

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

【讨论】:

以上是关于在 QPlainTextEdit 中获取指向 QTextBlock 的指针的主要内容,如果未能解决你的问题,请参考以下文章

Qt QPlainTextEdit 背景

QT软件开发: QPlainTextEdit当做日志显示窗口

Qt中的QLineEdit,QTextEdit和QPlainTextEdit的区别

Qt5 QPlainTextEdit怎么设置背景颜色和文字的颜色

如何在Qt中获取QWidget的QTabWidget标题文本?

pyqt 中怎么限定lineedit的数据类型