Как регулировать высоту QTextBrowser исходя из текста?

Есть QTextBrowser, в него добавляется текст неопределенной длины. Нужно, чтобы высота QTextBrowser подстраивалась под количества текста. Пробовал считать количество строк и под них указывать setMinimumHeight, но возникают проблемы, когда текст с абзацами, тегами и т.д. - много исключений.

Также нашел под C++ пример, но на PyQt получаю по такому примеру нулевой размер

QSize size = ui->textEdit->document()->size().toSize();
ui->textEdit->setFixedHeight( size.height()  );

Это возвращает 0:

text.document().size().height()

При добавлении текста при инициализации данный прием не срабатывает:

import sys
from PyQt5.Qt import *


class Demo(QWidget):    
    def __init__(self):        
        super().__init__()

        self.textBrowser = QTextBrowser()
        self.textBrowser.setFixedHeight(100)
        self.textBrowser.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)   # +

        text = \
            """
Есть QTextBrowser, в него добавляется текст неопределенной длины. Нужно, чтобы высота QTextBrowser подстраивалась под количества текста. Пробовал считать количество строк и под них указывать setMinimumHeight, но возникают проблемы, когда текст с абзацами, тегами и т.д. - много исключений.

Также нашел под C++ пример, но на PyQt получаю по такому примеру нулевой размер            
            """
        self.textBrowser.append(text)
        size = self.textBrowser.document().size().toSize()            # +++
        print(f'size = {size}')
        self.textBrowser.setFixedHeight(size.height())                # +++

        self.button = QPushButton("Show")
        self.button.clicked.connect(self.showDb)

        self.layout = QVBoxLayout(self)
        self.layout.addWidget(self.textBrowser)
        self.layout.addWidget(self.button)

    def showDb(self):
        text = \
            """
Есть QTextBrowser, в него добавляется текст неопределенной длины. Нужно, чтобы высота QTextBrowser подстраивалась под количества текста. Пробовал считать количество строк и под них указывать setMinimumHeight, но возникают проблемы, когда текст с абзацами, тегами и т.д. - много исключений.

Также нашел под C++ пример, но на PyQt получаю по такому примеру нулевой размер            
            """
        self.textBrowser.append(text)

        size = self.textBrowser.document().size().toSize()            # +++
        print(f'size = {size}')
        self.textBrowser.setFixedHeight(size.height())                # +++


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w  = Demo()
    w.show()
    app.exec_()

Ответы (2 шт):

Автор решения: S. Nick

Я проверил то что вы нашли и это работает:

import sys
from PyQt5.Qt import *


class Demo(QWidget):    
    def __init__(self):        
        super().__init__()

        self.textBrowser = QTextBrowser()
        self.textBrowser.setFixedHeight(100)
        self.textBrowser.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)   # +

        self.button = QPushButton("Show")
        self.button.clicked.connect(self.showDb)

        self.layout = QVBoxLayout(self)
        self.layout.addWidget(self.textBrowser)
        self.layout.addWidget(self.button)

    def showDb(self):
        text = \
            """
Есть QTextBrowser, в него добавляется текст неопределенной длины. Нужно, чтобы высота QTextBrowser подстраивалась под количества текста. Пробовал считать количество строк и под них указывать setMinimumHeight, но возникают проблемы, когда текст с абзацами, тегами и т.д. - много исключений.

Также нашел под C++ пример, но на PyQt получаю по такому примеру нулевой размер            
            """
        self.textBrowser.append(text)

        size = self.textBrowser.document().size().toSize()            # +++
        print(f'size = {size}')
        self.textBrowser.setFixedHeight(size.height())                # +++


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w  = Demo()
    w.show()
    app.exec_()

введите сюда описание изображения


Update

При добавлении текста при инициализации данный прием не срабатывает ?

При инициализации надо делать так:

import sys
from PyQt5.Qt import *


class Demo(QWidget):    
    def __init__(self):        
        super().__init__()

        self.textBrowser = QTextBrowser()
        self.textBrowser.setFixedHeight(100)
        self.textBrowser.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)   # +

        text = \
            """
Есть QTextBrowser, в него добавляется текст неопределенной длины. Нужно, чтобы высота QTextBrowser подстраивалась под количества текста. Пробовал считать количество строк и под них указывать setMinimumHeight, но возникают проблемы, когда текст с абзацами, тегами и т.д. - много исключений.

Также нашел под C++ пример, но на PyQt получаю по такому примеру нулевой размер            
            """
        self.textBrowser.append(text)

#        size = self.textBrowser.document().size().toSize()
#        size = self.textBrowser.document().size().toSize()
#        print(f'size = {size}')
#        self.textBrowser.setFixedHeight(size.height())
        QTimer.singleShot(10, self.textBrowserDocument)              # +++ <----

        self.button = QPushButton("Show")
        self.button.clicked.connect(self.showDb)

        self.layout = QVBoxLayout(self)
        self.layout.addWidget(self.textBrowser)
        self.layout.addWidget(self.button)

    def textBrowserDocument(self):                                    # +++ <----
        size = self.textBrowser.document().size().toSize()            # +++
        print(f'size = {size}')
        self.textBrowser.setFixedHeight(size.height())                # +++    

    def showDb(self):
        text = \
            """
Есть QTextBrowser, в него добавляется текст неопределенной длины. Нужно, чтобы высота QTextBrowser подстраивалась под количества текста. Пробовал считать количество строк и под них указывать setMinimumHeight, но возникают проблемы, когда текст с абзацами, тегами и т.д. - много исключений.

Также нашел под C++ пример, но на PyQt получаю по такому примеру нулевой размер            
            """
        self.textBrowser.append(text)

        size = self.textBrowser.document().size().toSize()            # +++
        print(f'size = {size}')
        self.textBrowser.setFixedHeight(size.height())                # +++


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w  = Demo()
    w.show()
    app.exec_()

введите сюда описание изображения

→ Ссылка
Автор решения: WD_KMS

Если не меняет размер и можно указать setMinimumWidth:

self.textBrowser.setMinimumWidth(500)
self.textBrowser.setAttribute(103)
self.textBrowser.show()
self.textBrowser.setFixedHeight(self.textBrowser.document().size().height()) 
→ Ссылка