"Красивое" размещение данных. Qt designer
Так должен выглядеть интерфейс. При изменении размера окна, размер окон с данными тоже должен меняться, кроме среднего(фиксированный размер).
Первое, что приходит на ум - использовать QTablewidget или QTableView, но у них размер ячеек не изменяется при изменении размера окна(или я не нашел как).
Решил использовать QTextEdit, а потом как-то допилить внешний вид.
Поведение окна, что описывается кодом снизу, полностью устраивает:
from PyQt5 import QtCore, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(243, 168)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.centralwidget)
self.splitter_2 = QtWidgets.QSplitter(self.centralwidget)
self.splitter_2.setOrientation(QtCore.Qt.Horizontal)
self.textEdit_9 = QtWidgets.QTextEdit(self.splitter_2)
self.textEdit_9.setText("TEXT")
self.textEdit_7 = QtWidgets.QTextEdit(self.splitter_2)
self.textEdit_7.setText("TEXT")
self.textEdit_7.setFixedSize(45, 148)
self.layoutWidget = QtWidgets.QWidget(self.splitter_2)
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget)
self.verticalLayout_2.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.textEdit_8 = QtWidgets.QTextEdit(self.layoutWidget)
self.textEdit_8.setText("TEXT")
self.verticalLayout_2.addWidget(self.textEdit_8)
self.textEdit_10 = QtWidgets.QTextEdit(self.layoutWidget)
self.textEdit_10.setText("111")
self.verticalLayout_2.addWidget(self.textEdit_10)
self.verticalLayout_3.addWidget(self.splitter_2)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
Но при добавлении дополнительных окон "красота" пропадает и нарушается положение верхних QTexEditотносительно нижних. При увеличении размеров окна всеQTextEdit опять выравниваются.
from PyQt5 import QtCore, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(465, 166)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.centralwidget)
self.splitter = QtWidgets.QSplitter(self.centralwidget)
self.splitter.setOrientation(QtCore.Qt.Horizontal)
self.textEdit_11 = QtWidgets.QTextEdit(self.splitter)
self.textEdit_11.setText("TEXT")
self.textEdit_11.setMinimumSize(QtCore.QSize(214, 0))
self.textEdit_11.setMaximumSize(QtCore.QSize(16777215, 80))
self.textEdit_12 = QtWidgets.QTextEdit(self.splitter)
self.textEdit_12.setText("TEXT")
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(1)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.textEdit_12.sizePolicy().hasHeightForWidth())
self.textEdit_12.setSizePolicy(sizePolicy)
self.textEdit_12.setMaximumSize(QtCore.QSize(90, 80))
self.widget = QtWidgets.QWidget(self.splitter)
self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.textEdit_13 = QtWidgets.QTextEdit(self.widget)
self.textEdit_13.setText("TEXT")
self.textEdit_13.setMaximumSize(QtCore.QSize(16777215, 30))
self.verticalLayout.addWidget(self.textEdit_13)
self.textEdit_14 = QtWidgets.QTextEdit(self.widget)
self.textEdit_14.setText("111")
self.textEdit_14.setMaximumSize(QtCore.QSize(16777215, 30))
self.verticalLayout.addWidget(self.textEdit_14)
self.verticalLayout_3.addWidget(self.splitter)
self.splitter_2 = QtWidgets.QSplitter(self.centralwidget)
self.splitter_2.setOrientation(QtCore.Qt.Horizontal)
self.textEdit_9 = QtWidgets.QTextEdit(self.splitter_2)
self.textEdit_9.setText("TEXT")
self.textEdit_9.setMinimumSize(QtCore.QSize(214, 0))
self.textEdit_9.setMaximumSize(QtCore.QSize(16777215, 80))
self.textEdit_7 = QtWidgets.QTextEdit(self.splitter_2)
self.textEdit_7.setText("TEXT")
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(1)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.textEdit_7.sizePolicy().hasHeightForWidth())
self.textEdit_7.setSizePolicy(sizePolicy)
self.textEdit_7.setMaximumSize(QtCore.QSize(90, 80))
self.widget1 = QtWidgets.QWidget(self.splitter_2)
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget1)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.textEdit_8 = QtWidgets.QTextEdit(self.widget1)
self.textEdit_8.setText("TEXT")
self.textEdit_8.setMaximumSize(QtCore.QSize(16777215, 30))
self.verticalLayout_2.addWidget(self.textEdit_8)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.textEdit_10 = QtWidgets.QTextEdit(self.widget1)
self.textEdit_10.setText("111")
self.textEdit_10.setMaximumSize(QtCore.QSize(16777215, 30))
self.horizontalLayout.addWidget(self.textEdit_10)
self.textEdit_15 = QtWidgets.QTextEdit(self.widget1)
self.textEdit_15.setText("111")
self.textEdit_15.setMaximumSize(QtCore.QSize(16777215, 30))
self.horizontalLayout.addWidget(self.textEdit_15)
self.verticalLayout_2.addLayout(self.horizontalLayout)
self.verticalLayout_3.addWidget(self.splitter_2)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
Тоже не нашел как исправить подобное расхождение и перешел на QGridLayout:
from PyQt5 import QtCore, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(465, 168)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.gridLayout = QtWidgets.QGridLayout()
self.textEdit_11 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_11.setText("TEXT")
self.textEdit_11.setMinimumSize(QtCore.QSize(214, 0))
self.textEdit_11.setMaximumSize(QtCore.QSize(16777215, 80))
self.gridLayout.addWidget(self.textEdit_11, 0, 0, 2, 1)
self.textEdit_12 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_12.setText("TEXT")
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.textEdit_12.sizePolicy().hasHeightForWidth())
self.textEdit_12.setSizePolicy(sizePolicy)
self.textEdit_12.setMaximumSize(QtCore.QSize(90, 80))
self.gridLayout.addWidget(self.textEdit_12, 0, 1, 2, 1)
self.textEdit_13 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_13.setText("TEXT")
self.textEdit_13.setMaximumSize(QtCore.QSize(16777215, 30))
self.gridLayout.addWidget(self.textEdit_13, 0, 2, 1, 2)
self.textEdit_14 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_14.setText("111")
self.textEdit_14.setMaximumSize(QtCore.QSize(16777215, 30))
self.gridLayout.addWidget(self.textEdit_14, 1, 2, 1, 2)
self.textEdit_9 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_9.setText("TEXT")
self.textEdit_9.setMinimumSize(QtCore.QSize(214, 0))
self.textEdit_9.setMaximumSize(QtCore.QSize(16777215, 80))
self.gridLayout.addWidget(self.textEdit_9, 2, 0, 2, 1)
self.textEdit_7 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_7.setText("TEXT")
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.textEdit_7.sizePolicy().hasHeightForWidth())
self.textEdit_7.setSizePolicy(sizePolicy)
self.textEdit_7.setMaximumSize(QtCore.QSize(90, 80))
self.gridLayout.addWidget(self.textEdit_7, 2, 1, 2, 1)
self.textEdit_8 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_8.setText("TEXT")
self.textEdit_8.setMaximumSize(QtCore.QSize(16777215, 30))
self.gridLayout.addWidget(self.textEdit_8, 2, 2, 1, 2)
self.textEdit_10 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_10.setText("111")
self.textEdit_10.setMaximumSize(QtCore.QSize(16777215, 30))
self.gridLayout.addWidget(self.textEdit_10, 3, 2, 1, 1)
self.textEdit_15 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_15.setText("111")
self.textEdit_15.setMaximumSize(QtCore.QSize(16777215, 30))
self.gridLayout.addWidget(self.textEdit_15, 3, 3, 1, 1)
self.verticalLayout.addLayout(self.gridLayout)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
Но с QGridLayout другая проблема. При увеличении окна, QTextEdit увеличиваются непропорционально друг другу. Выделенная область растягивается сильнее

Вопросы:
- Можно ли реализовать в
QTableWidgetдинамическое изменение размеров ячеек при изменении размеров окна? - Как в
QGridLayoutреализовать пропорциональное изменение размеровQTextEdit? - Если ничего из предыдущих вариантов невозможно, то в каком направлении искать написание нового класса?
Ответы (1 шт):
void QGridLayout::setColumnStretch(int column, int stretch)
Устанавливает коэффициент растяжения столбца для растяжения. Первый столбец - номер 0.
Больше ... https://doc.qt.io/qt-5/qgridlayout.html#setColumnStretch
from PyQt5 import QtCore, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(465, 168)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.gridLayout = QtWidgets.QGridLayout()
self.textEdit_11 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_11.setText("TEXT 11")
self.textEdit_11.setMinimumSize(QtCore.QSize(214, 0))
self.textEdit_11.setMaximumSize(QtCore.QSize(16777215, 80))
self.gridLayout.addWidget(self.textEdit_11, 0, 0, 2, 1)
self.textEdit_12 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_12.setText("TEXT")
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.textEdit_12.sizePolicy().hasHeightForWidth())
self.textEdit_12.setSizePolicy(sizePolicy)
self.textEdit_12.setMaximumSize(QtCore.QSize(90, 80))
self.gridLayout.addWidget(self.textEdit_12, 0, 1, 2, 1)
self.textEdit_13 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_13.setText("TEXT 13")
self.textEdit_13.setMinimumSize(QtCore.QSize(214, 0)) # +++
self.textEdit_13.setMaximumSize(QtCore.QSize(16777215, 30))
self.gridLayout.addWidget(self.textEdit_13, 0, 2, 1, 2)
self.textEdit_14 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_14.setText("111")
self.textEdit_14.setMaximumSize(QtCore.QSize(16777215, 30))
self.gridLayout.addWidget(self.textEdit_14, 1, 2, 1, 2)
self.textEdit_9 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_9.setText("TEXT")
self.textEdit_9.setMinimumSize(QtCore.QSize(214, 0))
self.textEdit_9.setMaximumSize(QtCore.QSize(16777215, 80))
self.gridLayout.addWidget(self.textEdit_9, 2, 0, 2, 1)
self.textEdit_7 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_7.setText("TEXT")
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.textEdit_7.sizePolicy().hasHeightForWidth())
self.textEdit_7.setSizePolicy(sizePolicy)
self.textEdit_7.setMaximumSize(QtCore.QSize(90, 80))
self.gridLayout.addWidget(self.textEdit_7, 2, 1, 2, 1)
self.textEdit_8 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_8.setText("TEXT")
self.textEdit_8.setMaximumSize(QtCore.QSize(16777215, 30))
self.gridLayout.addWidget(self.textEdit_8, 2, 2, 1, 2)
self.textEdit_10 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_10.setText("111")
self.textEdit_10.setMaximumSize(QtCore.QSize(16777215, 30))
self.gridLayout.addWidget(self.textEdit_10, 3, 2, 1, 1)
self.textEdit_15 = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit_15.setText("111")
self.textEdit_15.setMaximumSize(QtCore.QSize(16777215, 30))
self.gridLayout.addWidget(self.textEdit_15, 3, 3, 1, 1)
self.verticalLayout.addLayout(self.gridLayout)
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
class Demo(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.gridLayout.setColumnStretch(0, 2) # +++
self.gridLayout.setColumnStretch(1, 0) # +++
self.gridLayout.setColumnStretch(2, 1) # +++
self.gridLayout.setColumnStretch(3, 1) # +++
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
wtch = Demo()
wtch.show()
sys.exit(app.exec_())



