Масштабируемость элементов при изменении размера формы Qt Designer
Для компоновки элементов я использую layouts. Это хорошо работает, когда есть текстовые поля, таблицы и т.д. Но на некоторых вкладках моего приложения нет таких элементов, а есть только buttons и labels.
При использовании на таких вкладках layouts кнопки растягиваются (но выглядит это не очень), labels тоже растягиваются, но текст в них остаётся неизменным.
Я подумала, что на таких вкладках будет логично увеличить масштаб всех элементов, а не растягивать их, как в
При изменении размера на максимальный:

Как мне сделать что-то подобное и возможно ли такое сделать через Qt Designer или только в коде на Python (при загрузке файла .ui, без конвертации в .py)?
Update:
Вот пример, с файлом .ui: на форме 3 элемента label, textedit и button, они помещены в vertical layout, при изменении размера формы кнопка и таксовое поле растягиваются, label остаётся неизменным.
Как сделать, чтобы текст и в label, и в textedit увеличивался?
Python код:
import sys
from PyQt5 import uic
from PyQt5.Qt import *
class Window(QMainWindow):
def __init__(self):
super(Window, self).__init__()
uic.loadUi('test.ui', self)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())
test.ui:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>399</width>
<height>413</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label_2">
<property name="styleSheet">
<string notr="true">font-size: 24px;</string>
</property>
<property name="text">
<string>Задача организации</string>
</property>
</widget>
</item>
<item>
<widget class="QTextEdit" name="textEdit">
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="html">
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:10px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'Source Sans Pro'; font-size:8pt; color:#333333; background-color:#ffffff;">Таким образом новая модель организационной деятельности представляет собой интересный эксперимент проверки направлений прогрессивного развития. Значимость этих проблем настолько очевидна, что постоянный количественный рост и сфера нашей активности обеспечивает широкому кругу (специалистов) участие в формировании существенных финансовых и административных условий.</span></p>
<p style=" margin-top:0px; margin-bottom:10px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'Source Sans Pro'; font-size:8pt; color:#333333; background-color:#ffffff;">Не следует, однако забывать, что постоянное информационно-пропагандистское обеспечение нашей деятельности способствует подготовки и реализации новых предложений. Идейные соображения высшего порядка, а также начало повседневной работы по формированию позиции влечет за собой процесс внедрения и модернизации новых предложений.</span></p></body></html></string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>PushButton</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>399</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
test.py:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(399, 413)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setStyleSheet("font-size: 24px;")
self.label_2.setObjectName("label_2")
self.verticalLayout.addWidget(self.label_2)
self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit.setStyleSheet("")
self.textEdit.setObjectName("textEdit")
self.verticalLayout.addWidget(self.textEdit)
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 399, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label_2.setText(_translate("MainWindow", "Задача организации"))
self.textEdit.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:10px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;\"><span style=\" font-family:\'Source Sans Pro\'; font-size:8pt; color:#333333; background-color:#ffffff;\">Таким образом новая модель организационной деятельности представляет собой интересный эксперимент проверки направлений прогрессивного развития. Значимость этих проблем настолько очевидна, что постоянный количественный рост и сфера нашей активности обеспечивает широкому кругу (специалистов) участие в формировании существенных финансовых и административных условий.</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:10px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;\"><span style=\" font-family:\'Source Sans Pro\'; font-size:8pt; color:#333333; background-color:#ffffff;\">Не следует, однако забывать, что постоянное информационно-пропагандистское обеспечение нашей деятельности способствует подготовки и реализации новых предложений. Идейные соображения высшего порядка, а также начало повседневной работы по формированию позиции влечет за собой процесс внедрения и модернизации новых предложений.</span></p></body></html>"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
Ответы (1 шт):
В Qt Designer такое сделать нельзя.
Вам надо будет переопределять paintEvent соотверствующих классов:
class Label(QLabel):
...
def paintEvent(self, event):
...
или как посоветовал @Bogdan переопределять resizeEvent, примерно так:
Обратите внимание, что я переписал вводимый текст в формате html как простой текст.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.Qt import *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(399, 413)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
#@ self.label_2.setStyleSheet("font-size: 24px;") # ---
self.label_2.setObjectName("label_2")
self.verticalLayout.addWidget(self.label_2)
self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit.setStyleSheet("")
self.textEdit.setObjectName("textEdit")
self.verticalLayout.addWidget(self.textEdit)
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 399, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
# self.statusbar = QtWidgets.QStatusBar(MainWindow)
# self.statusbar.setObjectName("statusbar")
# MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label_2.setText(_translate("MainWindow", "Задача организации"))
self.textEdit.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:10px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;\"><span style=\" font-family:\'Source Sans Pro\'; \
font-size:8pt; color:#333333; background-color:#ffffff;\">Таким образом новая модель организационной деятельности представляет собой интересный эксперимент проверки направлений прогрессивного развития. \
Значимость этих проблем настолько очевидна, что постоянный количественный рост и сфера нашей активности обеспечивает широкому кругу (специалистов) участие в формировании существенных финансовых и административных условий.</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:10px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;\"><span style=\" font-family:\'Source Sans Pro\'; \
font-size:8pt; color:#333333; background-color:#ffffff;\">Не следует, однако забывать, что постоянное информационно-пропагандистское обеспечение нашей деятельности способствует подготовки и реализации новых предложений. Идейные соображения высшего порядка, а также начало повседневной работы по формированию позиции влечет за собой процесс внедрения и модернизации новых предложений.</span></p></body></html>"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
class Window(QMainWindow, Ui_MainWindow):
def __init__(self):
super(Window, self).__init__()
self.setupUi(self)
self.font = QtGui.QFont()
self.font.setFamily("Arial")
self.font.setPointSize(14)
self.setFont(self.font)
def resizeEvent(self, event):
w = self.size().width()
if w < 150:
self.font.setPointSize(8)
self.setFont(self.font)
self.textEdit.setFontPointSize(8)
elif 150 <= w < 300:
self.font.setPointSize(10)
self.setFont(self.font)
self.textEdit.setFontPointSize(9)
elif 300 <= w < 600:
self.font.setPointSize(14)
self.setFont(self.font)
self.textEdit.setFontPointSize(12)
elif 600 <= w < 800:
self.font.setPointSize(24)
self.setFont(self.font)
self.textEdit.setFontPointSize(15)
elif 800 <= w < 1000:
self.font.setPointSize(34)
self.setFont(self.font)
self.textEdit.setFontPointSize(20)
elif 1000 <= w < 1200:
self.font.setPointSize(44)
self.setFont(self.font)
self.textEdit.setFontPointSize(25)
elif w >= 1200:
self.font.setPointSize(54)
self.setFont(self.font)
self.textEdit.setPlainText(self.textEdit.toPlainText()) # +++ setPlainText
if __name__ == '__main__':
app = QApplication(sys.argv)
w = Window()
w.show()
sys.exit(app.exec_())



