Иерархии виджетов и макетов должна всегда следовать
widget -> layout -> widget -> layout -> widget -> ...
где каждый виджет может иметь только один макет, но каждый макет может содержать несколько виджетов (обратите внимание, что для простоты выше показывает только один виджет на макет).
Итак, вам нужно создать виджет, который содержит макет, и этот макет содержит QPushButton and
QLineEdit`. Например:
# construct the top level widget
widget = QWidget()
# construct the top level layout
layout = QVBoxLayout(widget)
# create the widgets to add to the layout
button = QPushButton('My Button')
lineedit = QLineEdit()
# add the widgets to the layout
layout.addWidget(button)
layout.addWidget(lineedit)
# set the layout on the widget
widget.setLayout(layout)
# we now have a single widget that contains a layout and 2 widgets
Это позволяет эффективно герметизировать несколько виджетов внутри одного виджета (и как много более сложных Qt виджетов создаются внутри, например QSpinBox
). Поэтому, если вам нужен еще один сложный виджет внутри макета выше, вы можете снова сделать еще один widget2 = QWidget()
, создать макет (например, layout2 = QHBoxLayout(widget2)
), а затем добавить к нему несколько виджетов. После этого добавьте виджет widget2
в исходный макет (layout.addWidget(widget2)
).
Надеюсь, теперь вы можете увидеть, как построить один сложный виджет из произвольного количества дочерних виджетов и макетов.
На данный момент, теперь вы можете установить единый виджет на существующий QMdiSubWIndow
# now add this widget to the QMdiSubWindow
mdisubwindow.setWidget(widget)
или в качестве альтернативы, вызовите функцию удобства на QMdiArea
создать новый QMdiSubWindow
с виджетом:
mdisubwindow = mdiarea.addSubWindow(widget)
Примечание. Для вашего конкретного примера вам фактически не нужно строить widget2
для инкапсуляции QHBoxLayout
. Вы можете добавить QHBoxLayout
(layout2
в моем примерном примере выше) непосредственно к исходному макету, позвонив по телефону layout.addLayout(layout2)
. Однако это скорее особый случай, и общий принцип инкапсуляции выше чередующихся виджетов и макетов более обобщен, как только вы начинаете создавать свои собственные классы виджетов для повторного использования кода.
Что вы пробовали? Вы пытались добавить общий экземпляр 'QWidget' в' QMdiSubWindow', а затем добавить макет к этому универсальному «QWidget» и разместить все ваши другие виджеты внутри этого макета? –
Я не уверен, что я слежу за тобой ?? – Ayoub
В этом случае я объяснил более подробно в ответе ниже. Я думаю, что это решит вашу проблему. –