我有 QScrollArea,它有 QVBoxLayout,我在其中放置小部件,其中之一是 QTextBrowser,我想让 QTextBrowser 具有其内容的大小并删除其滚动条。 我继承了 QTextBrowser,更改了 sizePolicy,隐藏了滚动条并重写了 sizeHint(),如下所示:
TextBrowserWidget::TextBrowserWidget(QWidget* parent)
: QTextBrowser(parent)
{
setSizePolicy(
QSizePolicy::Preferred,
QSizePolicy::Minimum);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
}
QSize TextBrowserWidget::sizeHint() const
{
if (document()) {
auto docSize = document()->size();
return QSize(docSize.width(), docSize.height() + 10);
} else
return QTextBrowser::sizeHint();
}
但这会带来延迟,一开始小部件会变小,1-2 秒后它就会变大。 我不确定这是否是一个好的解决方案。正确的做法是什么?
TextBrowserWidget::TextBrowserWidget(QWidget* parent)
: QTextBrowser(parent)
{
setSizePolicy(
QSizePolicy::Minimum,
QSizePolicy::MinimumExpanding);
connect(
this, &TextBrowserWidget::textChanged,
this, &TextBrowserWidget::updateSize);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
}
QSize TextBrowserWidget::sizeHint()
{
updateSize();
return QTextBrowser::sizeHint();
}
void TextBrowserWidget::updateSize()
{
document()->setTextWidth(viewport()->size().width());
auto docSize = document()->size().toSize();
setMinimumWidth(docSize.width());
setMinimumHeight(docSize.height() + 10);
}
非常感谢@devalone 提出问题和解决方案。我把它翻译成Python并简化了它。这是一个可行的解决方案:
from typing import Optional
from PySide6.QtCore import Qt
from PySide6.QtWidgets import QSizePolicy, QTextBrowser, QWidget
class AutoResizeTextBrowser(QTextBrowser):
def __init__(self, parent: Optional[QWidget] = None):
super().__init__(parent)
self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.MinimumExpanding)
self.textChanged.connect(self.update_size)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
def update_size(self):
self.document().setTextWidth(self.viewport().size().width())
self.setMinimumSize(self.document().size().toSize())