devalone
devalone

Reputation: 585

How to make QTextBrowser to have biggest size?

I have QScrollArea which has QVBoxLayout where I place widgets and one of them is QTextBrowser and I want to make QTextBrowser to have size of its content and to remove its scrollbars. I inherited QTextBrowser, changed sizePolicy, hid scrollbars and overrided sizeHint() like this:

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();
}

But this works with delay, at first widget becomes small and after 1-2 seconds it becomes bigger. I am not sure if it's good solution. What is the right way to do it?

Upvotes: 2

Views: 689

Answers (2)

PJ127
PJ127

Reputation: 1258

Thanks a lot @devalone for the question and solution. I translated it to Python and simplified it. Here is a working solution:

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())

Upvotes: 0

devalone
devalone

Reputation: 585

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);
}

Upvotes: 2

Related Questions