2016-05-29 4 views
1

К сожалению, мой вопрос может показаться очень глупо, но честно я провожу много времени в Интернете, пытаясь выяснить, как добавить виджет ы к QMdiSubWindow, я имею в виду несколько виджетов не только один виджет (это очень важно для меня .. Мне нужно, чтобы мое окно Sub содержало несколько виджета, а не один виджет).как поместить виджеты внутри PyQt QMdiSubWindow

, например, я хочу, чтобы добавить эти виджеты и макеты My Sub Window:

QVbox который содержит QLineEdit и кнопочный, и QHBox, которые содержат аа кнопочный ...

это Безразлично «т имеет значения, если вы показать мне, как я мог бы сделать это с помощью приведенного выше примера, что на самом деле дело в том, чтобы показать мне, как бы ни какой пример вы используете

Примечание: Пожалуйста, используйте ООП и Py Тона не с ++

+0

Что вы пробовали? Вы пытались добавить общий экземпляр 'QWidget' в' QMdiSubWindow', а затем добавить макет к этому универсальному «QWidget» и разместить все ваши другие виджеты внутри этого макета? –

+0

Я не уверен, что я слежу за тобой ?? – Ayoub

+0

В этом случае я объяснил более подробно в ответе ниже. Я думаю, что это решит вашу проблему. –

ответ

3

Иерархии виджетов и макетов должна всегда следовать

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). Однако это скорее особый случай, и общий принцип инкапсуляции выше чередующихся виджетов и макетов более обобщен, как только вы начинаете создавать свои собственные классы виджетов для повторного использования кода.

+0

Спасибо, что сработал очень хорошо, из моего кода моя проблема заключалась в том, что я пытаюсь добавить addLayout вместо addWidget – Ayoub

Смежные вопросы