标记 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 小部件来编辑此类文本(如果可能的话)。
其他要求是:
- 每个
class
都应该有特定的图形渲染(这应该很容易使用 CSS)。
- 编辑特定
<span>
应该保留 class
(即:如果我编辑 "John" -> "Jonathan" 它应该仍然有 class="name"
)。
- 我应该能够将
class
应用到特定的文本片段(即:select 一些文本,打开上下文菜单和 select 其中一个可能的 class
es).
- 从 selection 中删除标签。
- 序列化已编辑的文本(即:遍历已编辑的文本,识别
class
更改并能够生成我想要的任何标记)。
- 注意
class
es 可以一个包含在另一个中(但不能部分重叠);这意味着一些代码有两个(或更多)class
es.
这可以通过标准手段实现吗?
据我所知,QTextDocument 和相关的 classes(例如:QTextFrame、QTextFormat 等)面向视觉表示(字体样式、颜色等),而我需要一些 "logic" 可能会或可能不会反映在视觉变化中的标记。我的意思是:文本可以全部在同一个 font/color/background 中,但是将光标移到它上面我应该能够列出在那个特定位置(如果有的话)所有活动的 class
es。
如果相关的话,我正在用 PyQt5 编码。
我似乎看到实现此目的的唯一(相当丑陋!)方法是使用 QTextCharFormat
的 tooltip
属性 来存储 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)。
我必须编辑一个已被语义标记的文档。
假设我有一个 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 小部件来编辑此类文本(如果可能的话)。
其他要求是:
- 每个
class
都应该有特定的图形渲染(这应该很容易使用 CSS)。 - 编辑特定
<span>
应该保留class
(即:如果我编辑 "John" -> "Jonathan" 它应该仍然有class="name"
)。 - 我应该能够将
class
应用到特定的文本片段(即:select 一些文本,打开上下文菜单和 select 其中一个可能的class
es). - 从 selection 中删除标签。
- 序列化已编辑的文本(即:遍历已编辑的文本,识别
class
更改并能够生成我想要的任何标记)。 - 注意
class
es 可以一个包含在另一个中(但不能部分重叠);这意味着一些代码有两个(或更多)class
es.
这可以通过标准手段实现吗?
据我所知,QTextDocument 和相关的 classes(例如:QTextFrame、QTextFormat 等)面向视觉表示(字体样式、颜色等),而我需要一些 "logic" 可能会或可能不会反映在视觉变化中的标记。我的意思是:文本可以全部在同一个 font/color/background 中,但是将光标移到它上面我应该能够列出在那个特定位置(如果有的话)所有活动的 class
es。
如果相关的话,我正在用 PyQt5 编码。
我似乎看到实现此目的的唯一(相当丑陋!)方法是使用 QTextCharFormat
的 tooltip
属性 来存储 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)。