Вам необходимо использовать QSplitter .
Он действует почти как макет коробки, но имеет ручки, которые позволяют изменять размер каждого элемента.
Имейте в виду, что вы можно добавлять только виджеты в QSplitter, а не макеты, поэтому, если вам нужно добавить «раздел» (метку и виджет), который может изменять размеры его содержимого, вам нужно будет создать виджет container с его собственный макет.
Также обратите внимание, что использование словарей для подобных вещей крайне не рекомендуется. Для версий Python старше 3.7 порядок словаря совершенно произвольный, и хотя иногда может быть согласованным (например, когда ключи являются целыми числами), обычно это не так: с вашим кодом несколько раз все метки были собраны вместе, иногда виджеты были перевернуты и т. д. c., поэтому, если кто-то использует вашу программу с <= 3.6, ваш интерфейс не будет согласованным. Учтите, что хотя python 3.6 достигнет конца жизни в 2022 году, возможно, что даже после этого многие люди все еще будут использовать предыдущие версии. <br>Если вам нужен способ группировки объектов, лучше использовать list или кортеж, как я сделал в следующем примере.
Если вам действительно "нужно" , чтобы использовать группу на основе ключей, тогда вы можете использовать OrderedDict , но, скорее всего, что-то не так с логикой c, за которой нужно начинать.
class TestWindow(QMainWindow):
def __init__(self, left_ratio, right_ratio, window_title):
super().__init__()
self.left_ratio = left_ratio
self.right_ratio = right_ratio
self.current_image = None
self.window_title = window_title
self.setWindowTitle(self.window_title)
win_rectangle = self.frameGeometry()
center_point = QDesktopWidget().availableGeometry().center()
win_rectangle.moveCenter(center_point)
self.move(win_rectangle.topLeft())
self.tools = self.addToolBar('Tools')
self.left_widgets = {'Image': QLabel()}
self.right_widgets = [(QLabel('List1'), QListWidget()),
(QLabel('List2'), QListWidget())]
self.central_widget = QSplitter(Qt.Horizontal, self)
self.setCentralWidget(self.central_widget)
self.right_splitter = QSplitter(Qt.Vertical, self)
self.adjust_widgets()
self.central_widget.setStretchFactor(0, left_ratio)
self.central_widget.setStretchFactor(1, right_ratio)
self.show()
def adjust_widgets(self):
self.central_widget.addWidget(self.left_widgets['Image'])
self.left_widgets['Image'].setPixmap(QPixmap('test.jpg').scaled(500, 400, Qt.IgnoreAspectRatio,
Qt.SmoothTransformation))
self.left_widgets['Image'].setScaledContents(True)
self.central_widget.addWidget(self.right_splitter)
for label, widget in self.right_widgets:
container = QWidget()
layout = QVBoxLayout(container)
layout.addWidget(label)
layout.addWidget(widget)
self.right_splitter.addWidget(container)