0

我必须编辑已在语义上标记的文档。

假设我有一个 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特定的文本片段(即:选择一些文本,打开上下文菜单并选择可能的classes 之一)。
  • 从选择中删除标记。
  • 序列化已编辑的文本(即:遍历已编辑的文本,识别class更改并能够生成我想要的任何标记)。
  • Note classes 可以相互包含(但不能部分重叠);这意味着某些代码有两个(或更多)classes。

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

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

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

我似乎看到实现这一目标的唯一(相当丑陋!)方法是使用QTextCharFormat'tooltip属性来存储每个QTextFragment. 有更好的选择吗?

4

1 回答 1

0

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

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

你需要:

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

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

重要提示:如果您使用的是 PyQt,那么您可以存储和安全检索的内容受到严格限制(将 a 存储QTextDocument在 aQStandardItem.setData(doc, mycode)中将无法可靠地工作,因为只会存储引用,并且如果底层 python 对象被垃圾收集,您将拥有一个不错的崩溃(SIGSEGV)。

于 2019-06-14T15:42:19.280 回答