标记 QTextDocument 的特定部分

Tagging specific parts of QTextDocument

我必须编辑一个已被语义标记的文档。

假设我有一个 HTML 文档,其中一些或所有段落(或跨度)已被标记为特定的 class 名称,例如:<p class="bio"><span class="name">John</span><span class="surname">Doe</span>is a <span class="job">carpenter</span> living in <span class="place">York</span>.</p><p class="story">He was working at his bench when...</p>

我想使用 QTextEdit 小部件来编辑此类文本(如果可能的话)。

其他要求是:

这可以通过标准手段实现吗?

据我所知,QTextDocument 和相关的 classes(例如:QTextFrame、QTextFormat 等)面向视觉表示(字体样式、颜色等),而我需要一些 "logic" 可能会或可能不会反映在视觉变化中的标记。我的意思是:文本可以全部在同一个 font/color/background 中,但是将光标移到它上面我应该能够列出在那个特定位置(如果有的话)所有活动的 classes。

如果相关的话,我正在用 PyQt5 编码。

我似乎看到实现此目的的唯一(相当丑陋!)方法是使用 QTextCharFormattooltip 属性 来存储 class(es)每个 QTextFragment。还有更好的选择吗?

遇到同样问题的人:

QTextCharFormat 有一个 属性(名为 "Property"),可用于保存任意数据。

您需要:

  • 定义您的代码集(高于 QtGui.QTextFormat.UserProperty 以避免与现有属性发生冲突)。
  • 设置为:format.setProperty(mycode, myvalue)
  • 回读:value = format.property(mycode)

其他小部件具有相似(但不完全相同!)机制(例如:QStandardItem 具有相似的 属性,称为 data

重要说明:如果您使用的是 PyQt,那么您可以存储和安全检索的内容有严格的限制(将 QTextDocument 存储在 QStandardItem.setData(doc, mycode) 不会 可靠地工作,因为只有引用会被存储,如果底层 python 对象被垃圾收集,你将有一个很好的崩溃 (SIGSEGV)。