如何设置QWebView的高度来保存其内容?

时间:2015-05-26 08:14:30

标签: python qt pyqt

HtmlEditor 是空的,可编辑的,并且最初只显示一行。它的高度足以容纳一条线,不再大或小。当用户输入更多文本行时,它的高度将延伸。

但问题是, HtmlEditor 的高度一开始要小一些。我想这是因为高度设置为字体的大小,但字体周围也有边距,这是不考虑的。在其中输入一个字符后, HtmlEditor 的高度很快就会变大,这足以保留文本,这要归功于sizeChange函数。我希望我也可以将 HtmlEditor 的MaximumHeight设置为self.page().mainFrame().contentsSize().height(),因为contentsSize().height()似乎很适合保存文本。但考虑到最初根本没有内容似乎是不可能的,在这种情况下contentsSize().height()只是一个错误的数字。如何做到这一点,将 HtmlEditor 的MaximumHeight和MinimumHeight设置为内容的高度来保持它?

class HtmlEditor(QWebView):
    def __init__(self):
        super().__init__()
        self.page().setContentEditable(True)
        self.page().contentsChanged.connect(self.sizeChange)
        self.setUpFont(10)

    def setUpFont(self, fontSize):
        self.htmlEditorSettings = self.settings()
        self.htmlEditorSettings.setFontSize(QWebSettings.DefaultFontSize, fontSize)
        self.setMaximumHeight(fontSize)

    def sizeChange(self):
        docHeight = self.page().mainFrame().contentsSize().height()
        self.setMinimumHeight(docHeight)

2 个答案:

答案 0 :(得分:1)

以下是使用QFontMetrics的hackish解决方案。我认为它是hackish,因为我必须手动实现文本。可能有一个很好的理由让QFontMetrics似乎吐出一个不好的价值,但这应该适合你。

我们会获取一行文字的所有大小调整信息,计算出我们使用的行数,并相应地调整QWebView的大小:

class HtmlEditor(QWebView):
    def __init__(self):
        super().__init__()
        self.page().setContentEditable(True)
        self.page().contentsChanged.connect(self.update_height)
        self.settings().setFontSize(QWebSettings.DefaultFontSize, 10)
        self.setContentsMargins(QMargins(10, 10, 10, 10))
        self.update_height()

    def update_height(self):
        num_lines = len(self.page().mainFrame().toPlainText().splitlines())
        if num_lines == 0:
            num_lines = 1
        margins = self.contentsMargins()
        metrics = self.fontMetrics()
        leading = 4  # You should be able to do metrics.leading() but it was giving me 0 for some reason
        line_height = metrics.height()  # For the above reason, we use height() here instead of metrics.lineSpacing() and add the leading manually
        self.setFixedHeight((line_height * num_lines) + (leading * (num_lines - 1)) + margins.top() + margins.bottom())

如果有人能够在这种情况下对QFontMetrics的奇怪行为进行推理,我会非常感激。

答案 1 :(得分:0)

感谢@MichaelBlakeley,这是我的最终代码:

class HtmlEditor(QWebView):
    def __init__(self):
        super().__init__()
        self.page().setContentEditable(True)
        self.page().contentsChanged.connect(self.sizeChange)
        self.setupFont(10)

    def setupFont(self, fontSize):
        self.htmlEditorSettings = self.settings()
        self.htmlEditorSettings.setFontSize(QWebSettings.DefaultFontSize, fontSize)
        margins = self.contentsMargins()
        self.setFixedHeight(fontsize + margins.top() + margins.bottom())

    def sizeChange(self):
        docHeight = self.page().mainFrame().contentsSize().height()
        self.setFixedHeight(docHeight)