如何在Qt中的多行后删除富文本?

时间:2015-09-30 16:02:36

标签: qt pyside richtext

我正在尝试使用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?

1 个答案:

答案 0 :(得分:0)

不是 Python 解决方案,但我认为 https://stackoverflow.com/a/66412942/3907364 中的方法可以很容易地移植到 Python。

简而言之:使用 QTextDocument 解析和表示富文本,然后使用 QTextCursor 不断从中删除字符,直到达到所需的宽度。

请注意,这并没有专门处理多行字符串(实际上我的答案侧重于单行字符串),但我认为将其扩展到多行输入应该是可行的。