我正在尝试使用Qt和Pyside来删除富文本(使用html类型的链接)。文本字符串将是这样的:
u"<a href='FRIEND' style=\"text-decoration: none\">" \
u"<font color=#1abc9c>{}</font></a> agregó <a href='LINK' " \
u"style=\"text-decoration: none\"><font color=#1abc9c>{}</font></a>" \
u" a su biblioteca".format(EntityMocks.friendMock.display_name,
EntityMocks.assetMock1.title)
documentation of Qt明确指出这不能使用富文本来完成,所以我在将所有html标签的文本传递给Qt的elider之前将其剥离。我也试图为多条线路上的文本做到这一点。这是我的测试代码,只有两行:
class DoubleElidedText(QLabel):
def __init__(self, *args):
super(DoubleElidedText, self).__init__(*args)
def setText(self, text):
self.setToolTip(text)
self.update()
metrics = QFontMetrics(self.font())
elide = metrics.elidedText(strip_tags(text), Qt.ElideRight, self.width()*2 - self.width()/5)
if metrics.width(elide) > self.width():
self.setMinimumHeight(metrics.height()*2)
else:
self.setMinimumHeight(metrics.height())
texto = u"{}".format(elide)
super(DoubleElidedText, self).setText(texto)
class MLStripper(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.reset()
self.fed = []
def handle_data(self, d):
self.fed.append(d)
def get_data(self):
return ''.join(self.fed)
def strip_tags(html):
s = MLStripper()
s.feed(html)
return s.get_data()
此行为(剥离html标记)已成为我的软件无法接受的。
我正在尝试开发一种方法来忽略将在具有多行的QLabel中显示的富文本。手动执行此操作会引发一个我无法解决的特定问题:
显示行的长度是多少?(取决于每行末尾添加的空白区域)。
我是否正确解决了这个问题,或者我的研究中是否缺少一些QtMagic?
答案 0 :(得分:0)
不是 Python 解决方案,但我认为 https://stackoverflow.com/a/66412942/3907364 中的方法可以很容易地移植到 Python。
简而言之:使用 QTextDocument
解析和表示富文本,然后使用 QTextCursor
不断从中删除字符,直到达到所需的宽度。
请注意,这并没有专门处理多行字符串(实际上我的答案侧重于单行字符串),但我认为将其扩展到多行输入应该是可行的。