Динамическое изменение размеров виджета по контенту
Создается виджет в Qt Designer. Задача, чтобы верхний QTextBrowser сдвигал всё на форме и увеличивал размеры формы в зависимости от помещенного туда текста. Выставлены ограничения 12 и 100 по высоте. После 100 появляется скролл, всё корректно, но только если удалить позиционирование размеров Form.resize(215, 173). Как в Qt Desgner выставить настройки, чтобы не надо было трогать руками сформированный ui?
untitled.py:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
#Form.resize(215, 173)
self.verticalLayout = QtWidgets.QVBoxLayout(Form)
self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)
self.verticalLayout.setObjectName("verticalLayout")
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setContentsMargins(-1, -1, -1, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.textBrowser = QtWidgets.QTextBrowser(Form)
self.textBrowser.setMinimumSize(QtCore.QSize(0, 12))
self.textBrowser.setMaximumSize(QtCore.QSize(16777215, 100))
self.textBrowser.setObjectName("textBrowser")
self.verticalLayout_2.addWidget(self.textBrowser)
self.verticalLayout.addLayout(self.verticalLayout_2)
self.verticalLayout_3 = QtWidgets.QVBoxLayout()
self.verticalLayout_3.setContentsMargins(-1, -1, -1, 9)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.textEdit = QtWidgets.QTextEdit(Form)
self.textEdit.setSizeIncrement(QtCore.QSize(0, 0))
self.textEdit.setObjectName("textEdit")
self.verticalLayout_3.addWidget(self.textEdit)
self.verticalLayout.addLayout(self.verticalLayout_3)
QtCore.QMetaObject.connectSlotsByName(Form)
main.py:
import sys
from PyQt5.QtWidgets import *
from untitled import Ui_Form
class Main(QWidget):
def __init__(self):
QWidget.__init__(self)
self.ui = Ui_Form()
self.ui.setupUi(self)
self.ui.textBrowser.setText("Привет. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. ")
if __name__ in '__main__':
app = QApplication(sys.argv)
w = Main()
w.show()
sys.exit(app.exec_())
Необходимо получить:
Ответы (1 шт):
я не знаю зачем вам для каждого виджета QVBoxLayout?
Если убрать лишние QVBoxLayout и установить stretch, то ваш пример выглядит так:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
#from untitled import Ui_Form
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(215, 173)
self.verticalLayout = QtWidgets.QVBoxLayout(Form)
self.verticalLayout.setObjectName("verticalLayout")
self.textBrowser = QtWidgets.QTextBrowser(Form)
self.textBrowser.setMinimumSize(QtCore.QSize(0, 12))
self.textBrowser.setMaximumSize(QtCore.QSize(16777215, 100))
self.textBrowser.setObjectName("textBrowser")
self.verticalLayout.addWidget(self.textBrowser, stretch=1)
self.textEdit = QtWidgets.QTextEdit(Form)
self.textEdit.setObjectName("textEdit")
self.verticalLayout.addWidget(self.textEdit, stretch=1)
QtCore.QMetaObject.connectSlotsByName(Form)
class Main(QWidget):
def __init__(self):
QWidget.__init__(self)
self.ui = Ui_Form()
self.ui.setupUi(self)
self.ui.textBrowser.setText("Привет. Длинный текст. " * 100)
# Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. ")
if __name__ in '__main__':
app = QApplication(sys.argv)
w = Main()
w.show()
print(w.size())
sys.exit(app.exec_())
Update
Пускай будет по вашему.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
#from untitled import Ui_Form
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(215, 173)
self.verticalLayout = QtWidgets.QVBoxLayout(Form)
self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)
self.verticalLayout.setObjectName("verticalLayout")
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setContentsMargins(-1, -1, -1, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.textBrowser = QtWidgets.QTextBrowser(Form)
self.textBrowser.setMinimumSize(QtCore.QSize(0, 12))
self.textBrowser.setMaximumSize(QtCore.QSize(16777215, 100))
self.textBrowser.setObjectName("textBrowser")
self.verticalLayout_2.addWidget(self.textBrowser, stretch=1)
self.verticalLayout.addLayout(self.verticalLayout_2, stretch=1)
self.verticalLayout_3 = QtWidgets.QVBoxLayout()
self.verticalLayout_3.setContentsMargins(-1, -1, -1, 9)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.textEdit = QtWidgets.QTextEdit(Form)
self.textEdit.setSizeIncrement(QtCore.QSize(0, 0))
self.textEdit.setObjectName("textEdit")
self.verticalLayout_3.addWidget(self.textEdit, stretch=1)
self.verticalLayout.addLayout(self.verticalLayout_3, stretch=1)
QtCore.QMetaObject.connectSlotsByName(Form)
class Main(QWidget):
def __init__(self):
QWidget.__init__(self)
self.ui = Ui_Form()
self.ui.setupUi(self)
self.ui.textBrowser.setText("Привет. Длинный текст. " * 100)
# Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. Длинный текст. ")
if __name__ in '__main__':
app = QApplication(sys.argv)
w = Main()
w.show()
sys.exit(app.exec_())
Update 2
я предлагаю воспользоваться возможностями QFontMetrics Class
Класс QFontMetrics предоставляет информацию о метриках шрифтов.
Больше https://doc.qt.io/qt-5/qfontmetrics.html
Попробуйте набрать различные строки (короткие и длинные)
в окошке QTextEdit. После набора строки/строк сделайте двойной клик
(выделите любой участок текста) и все что есть в QTextEdit
занесется в QTextBrowser.
Попробуйте также изменить размеры окна.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
#from untitled import Ui_Form
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(215, 173)
self.verticalLayout = QtWidgets.QVBoxLayout(Form)
self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize)
self.verticalLayout.setObjectName("verticalLayout")
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setContentsMargins(-1, -1, -1, 0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.verticalLayout_2.setSizeConstraint(QtWidgets.QLayout.SetMinimumSize )
self.textBrowser = QtWidgets.QTextBrowser(Form)
self.textBrowser.setMinimumSize(QtCore.QSize(0, 25))
self.textBrowser.setMaximumSize(QtCore.QSize(16777215, 100))
self.textBrowser.setObjectName("textBrowser")
self.verticalLayout_2.addWidget(self.textBrowser)
self.verticalLayout.addLayout(self.verticalLayout_2)
self.verticalLayout_3 = QtWidgets.QVBoxLayout()
self.verticalLayout_3.setContentsMargins(-1, -1, -1, 9)
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.textEdit = QtWidgets.QTextEdit(Form)
self.textEdit.setSizeIncrement(QtCore.QSize(0, 0))
self.textEdit.setSizePolicy(QtWidgets.QSizePolicy.Ignored,
QtWidgets.QSizePolicy.Minimum)
self.textEdit.setObjectName("textEdit")
self.verticalLayout_3.addWidget(self.textEdit, stretch=1)
self.verticalLayout.addLayout(self.verticalLayout_3, stretch=1)
QtCore.QMetaObject.connectSlotsByName(Form)
class Main(QWidget, Ui_Form): # + Ui_Form
def __init__(self):
QWidget.__init__(self)
# self.ui = Ui_Form() # -
self.setupUi(self) # +
self.textBrowser.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # +
self.textEdit.textChanged.connect(self.text_changed) # +
self.textEdit.copyAvailable.connect(self.copy_available) # +
self.len_lines = ... # +
self.text = "Hello World"
self.textBrowser.setText(self.text)
def text_changed(self): # +
self._textEdit = self.textEdit.toPlainText()
def copy_available(self, _bool): # +
if _bool:
self.textBrowser.setText(self._textEdit)
self.func()
def resizeEvent(self, event): # +
self.func()
def func(self): # + !!!
self.fontD = self.textBrowser.font()
self.metrics = QFontMetrics(self.fontD)
lines = self.textBrowser.toPlainText().split('\n')
self.len_lines = len(lines)
self.widthTextBrowser = self.textBrowser.size().width()
for line in lines:
_width = self.metrics.width(line)
if _width > self.widthTextBrowser:
# Отрегулируйте значение, если в этом будет необходимость >>> vv
self.len_lines += int(round(_width / (self.widthTextBrowser - 20) + 0.5, 0)) - 1
# Отрегулируйте значение koef, если в этом будет необходимость
if self.len_lines < 2:
koef = 23
elif self.len_lines == 2:
koef = 36
elif self.len_lines == 3:
koef = 50
elif self.len_lines == 4:
koef = 63
elif self.len_lines == 5:
koef = 76
elif self.len_lines == 6:
koef = 88
elif self.len_lines > 6:
koef = 101
self.textBrowser.setMinimumSize(QtCore.QSize(120, koef)) # !!!
self.textBrowser.setMaximumSize(QtCore.QSize(16777215, koef)) # !!!
if __name__ in '__main__':
app = QApplication(sys.argv)
w = Main()
w.show()
sys.exit(app.exec_())






