如何让QTextBrowser的尺寸最大?

问题描述 投票:0回答:2

我有 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 秒后它就会变大。 我不确定这是否是一个好的解决方案。正确的做法是什么?

c++ qt qscrollarea qlayout
2个回答
1
投票
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);
}

0
投票

非常感谢@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())
© www.soinside.com 2019 - 2024. All rights reserved.