Как регулировать высоту 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())

