【问题标题】:Tagging specific parts of QTextDocument标记 QTextDocument 的特定部分
【发布时间】:2019-06-11 23:27:38
【问题描述】:

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

假设我有一个 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 更改并能够生成我想要的任何标记)。
  • 注意classes 可以相互包含(但不能部分重叠);这意味着某段代码有两个(或更多)classes。

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

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

如果相关,我正在 PyQt5 中编码。

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

【问题讨论】:

    标签: pyqt5 semantic-markup tagging qtextedit qtextdocument


    【解决方案1】:

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

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

    你需要:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-28
      • 2014-02-18
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 2023-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多