标记QTextDocument的特定部分

时间:2019-06-11 23:27:38

标签: pyqt5 semantic-markup tagging qtextedit qtextdocument

我必须编辑带有语义标记的文档。

假设我有一个HTML文档,其中某些或所有段落(或跨度)已用特定的类名标记,例如:<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小部件来编辑此类文本(如果可能)。

其他要求是:

  • 每个class应该具有特定的图形渲染(使用CSS应该很容易)。
  • 编辑特定的<span>应该保留class(即:如果我编辑“ John”->“ Jonathan”,它应该仍然有class="name")。
  • 我应该能够将class应用于特定的文本段(即:选择一些文本,打开上下文菜单,然后选择可能的class es之一)。
  • 从选择中删除标签。
  • 序列化编辑后的文本(即:浏览编辑后的文本,识别class的更改,并能够生成我想要的任何标记)。
  • 请注意,class个可以包含在另一个内部(但不能部分重叠);这意味着某段代码具有两个(或多个)class

这可以通过标准方式实现吗?

据我所见,QTextDocument和相关类(例如:QTextFrame,QTextFormat等)适合视觉表示(字体样式,颜色等),而我需要一些“逻辑”标记,这些标记可能反映也可能不反映在视觉上的变化。我的意思是:文本可以全部使用相同的字体/颜色/背景,但是将光标移到该文本上我应该能够列出该特定位置(如果有)中所有有效的class个字符。

如果需要的话,我正在PyQt5中进行编码。

我似乎看到的唯一(相当丑陋!)的方法是使用QTextCharFormat的{​​{1}}属性存储每个tooltip的类。有更好的选择吗?

1 个答案:

答案 0 :(得分:0)

对于有相同问题的任何人:

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

您需要:

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

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

重要说明:如果您使用的是PyQt,则存储和安全检索的内容将受到严格限制(将QTextDocument中的QStandardItem.setData(doc, mycode)存储在<{>仅引用将被存储,并且如果底层python对象被垃圾回收,您将遭受严重的崩溃(SIGSEGV)。