Найти - Пользователи
Полная версия: PyQt4: layout. Как правильно собрать?
Начало » GUI » PyQt4: layout. Как правильно собрать?
1
Razor
Имеется PyQt4 приложение. Хочу, чтобы при расширении все элементы интерфейса тоже расширялись.

Собственно выглядит все так (надеюсь рофляночек по поводу названий узлов не будет):


Текущий код выглядит так:

Левый нижний блок с кнопками:
left_column_buttons_layout = QHBoxLayout(self)
left_column_buttons_layout.addWidget(self.ui.select_all_nodes)
left_column_buttons_layout.addWidget(self.ui.clear_all_nodes)
left_column_buttons_layout.addWidget(self.ui.add_node)
left_column_buttons_layout.addWidget(self.ui.remove_nodes)

Объединяем весь левый блок:
left_column_layout = QVBoxLayout(self)
left_column_layout.addWidget(self.ui.search_line)
left_column_layout.addWidget(self.ui.nodes_list)
left_column_layout.addLayout(left_column_buttons_layout)

Центральный верхний блок с кнопками:
middle_top_buttons = QHBoxLayout(self)
middle_top_buttons.addWidget(self.ui.select_all)
middle_top_buttons.addWidget(self.ui.clear_all)
middle_top_buttons.addWidget(self.ui.add_variant)
middle_top_buttons.addWidget(self.ui.remove_variant)
middle_top_buttons.addWidget(self.ui.delete_variant)

Центральный блок посередине с кнопками:
middle_generate_buttons_layout = QHBoxLayout(self)
middle_generate_buttons_layout.addWidget(self.ui.generate)
middle_generate_buttons_layout.addWidget(self.ui.count_results)
middle_generate_buttons_layout.addWidget(self.ui.label)
middle_generate_buttons_layout.addWidget(self.ui.to_clipboard)

Объединяем весь центральный блок:
middle_column_layout = QVBoxLayout()
middle_column_layout.addLayout(middle_top_buttons)
middle_column_layout.addWidget(self.ui.variants_list)
middle_column_layout.addLayout(middle_generate_buttons_layout)
middle_column_layout.addWidget(self.ui.text_output)

Объединяем все верстки и правое поле:
layout = QHBoxLayout(self)
layout.addLayout(left_column_layout)
layout.addLayout(middle_column_layout)
layout.addWidget(self.ui.title_tree)

То есть собираем разные скопление элементов по блокам как на рисунке, а потом пытаемся все это дело объединить. Но при изменении размера ничего не происходит. Где я ошибся и повернул не там?

Заранее спасибо за ваши ответы и внимание.
vic57
я определял виджет, а в нем собственный layout
box = QGroupBox()
grid = QGridLayout(box)
grid.addWidget(............
box1 = QGroupBox()
grid1 = QGridLayout(box1)
grid1.addWidget............
w = QWidget()
maingrid = QGridLayout(w)
maingrid.addWidget(0,0,box)
maingrid.addWidget(0,1,box1)
и у вас ошибка же идет - layout уже есть
Razor
vic57
и у вас ошибка же идет - layout уже есть

Вот это рабочий код (с модального окна):

ver_layout = QVBoxLayout(self)
ver_layout.addWidget(self.ui.label)
ver_layout.addWidget(self.ui.values_list)
ver_layout.addWidget(self.ui.replace_in)
ver_layout.addWidget(self.ui.replace_out)
hor_checkbox_layout = QHBoxLayout(self)
hor_checkbox_layout.setContentsMargins(0, 15, 0, 0)  # left, top, right, bottom
hor_checkbox_layout.addWidget(self.ui.match_case)
hor_checkbox_layout.addWidget(self.ui.regexp_enable)
hor_checkbox_layout.addWidget(self.ui.one_word)
hor_checkbox_layout.addWidget(self.ui.only_selected_node)
hor_buttons_layout = QHBoxLayout(self)
hor_buttons_layout.setContentsMargins(0, 15, 0, 0)
hor_buttons_layout.addWidget(self.ui.replace)
hor_buttons_layout.addWidget(self.ui.replace_all)
hor_buttons_layout.addWidget(self.ui.replace_selected)
hor_buttons_layout.addWidget(self.ui.exclude)
ver_layout.addLayout(hor_checkbox_layout)
ver_layout.addLayout(hor_buttons_layout)
vic57
QSizePolicy может быть?
http://230100.msiu.ru/files/49355-qt_basics.html#менеджеры-размещения
ИМХО родительский лэйаут должен быть один (parent=self), для вложенных self определять не надо (parent=None) вроде по дефолту
Сначала создаётся родительский виджет. Потом дочерние виджеты (нет необходимости указывать выстраивать родственные отношения между родителем и детьми во время конструирования). Далее создаётся экземпляр менеджера размещения, дочерние виджеты помещаются в него как в контейнер. На последнем этапе менеджер размещения устанавливается в родительский виджет с помощью метода setLayout(). Некоторые менеджеры размещения так же могут быть вложены друг в друга; тогда вложенный менеджер трактуется обрамляющим менеджером как обычный виджет, хотя экземпляры QLayout не являются виджетами как таковые.
#!/usr/bin/env python
#-*-coding:utf8-*-
from PyQt4.Qt import *
class W(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        
        self.btn1 = QPushButton('Click')
        self.lbl1= QLabel('Label')
        self.lay1 = QHBoxLayout()
        self.lay1.setMargin(0)
        self.lay1.addWidget(self.lbl1)
        self.lay1.addWidget(self.btn1)
        self.btn = QPushButton('Press')
        self.edit = QPlainTextEdit()
        self.lay = QVBoxLayout(self) #parent layout
        self.lay.setMargin(0)
        self.lay.addLayout(self.lay1)
        self.lay.addWidget(self.edit)
        self.lay.addWidget(self.btn)
app = QApplication([])
w = W()
w.edit.insertPlainText('Hello !')
w.move(0,0)
w.show()
app.exec_()


This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB