使用QSyntaxHighlighter隐藏文本

6

问题: 我想为带有附加标签的文本实现文本编辑小部件。 我希望某些标签在某些情况下是不可见的,以免分散用户注意力。

环境: 我正在使用 PyQt 并倾向于使用 QPlainTextWidgetQSyntaxHighlighter

解决方案: 使用 QSyntaxHighlighter,我可以针对符合我的要求的字符串设置 QTextCharFormatQTextCharFormat 具有所有字体属性,如大小、颜色等。但:我没有找到隐藏文本或将其大小减小到零的选项。

我不想删除或替换标记,因为这将引入更多的代码(复制应包含标记,否则我无法使用 QSyntaxHighlighter 根据标记对余下的文本进行格式化)。

更新: 到目前为止,我找到了一个丑陋的方法。通过将 QTextFormat::FontLetterSpacing 设置为一个小值,文本将占用越来越少的空间。与透明颜色结合使用,文本就像是不可见的。

问题: 在我的测试中,这仅适用于字母间距小于 0.016%。在间距低于此值时,间距将被重置为 100%。


好的,纯文本就是纯文本。尝试使用非纯文本小部件。 - Oleh Prypin
我在QTextEdit中没有找到相应的选项。据我所知,差异仅限于滚动行为、表格、框架和像图片之类的东西。可能使文本隐藏的函数与QPlainTextEdit相同。除此之外,在Qt中没有更高级的类。使用QScintilla将意味着使用完全不同的东西。 - m2j
1个回答

4
您可以使用底层的QTextDocument 来实现此功能。它由块组成,可以使用 setVisible 开启和关闭其可见性。使用 QTextCursor 插入文本和新块,并切换可见性。作为奖励,复制功能仍会复制非可见块的内容。
注:有关更多信息,请参阅 QTextCursor 的文档。在另一个问题中曾报告过,设置可见性不起作用于 QTextEdits
示例:
from PyQt5 import QtWidgets, QtGui

app = QtWidgets.QApplication([])

w = QtWidgets.QPlainTextEdit()
w.show()

t = QtGui.QTextCursor(w.document())
t.insertText('plain text')
t.insertBlock()
t.insertText('tags, tags, tags')
t.block().setVisible(False)

print(w.document().toPlainText())

app.exec_()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接