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)
答案 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)