change expanding space of nested layouts in pyqt

Viewed 896

I want to seperate the widgets of the mainwindow into 3 layouts and add them into a mainlayout the center layout contains a tablewidget and shoud have a bigger width then the left/right one. so far I did not found a way to use a grid layout and adjust each column width individualy.

therefore I tryed to use 3 vboxlayouts and insert them into an hboxlayout

what if read so far is that the widgets size are fixed so they expand at the same rate if stretched.

is there an easier way to make the center layout widht bigger with for example inserting an spacer without changing the SizePolicy of each widget ?

import sys

from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
from PyQt5 import QtGui as qtg


class Stretchme(qtw.QWidget):
    def __init__(self):
        super().__init__()

        # # View
        table_widget = qtw.QTableWidget()


        # -----interface--widgets--------------------------#

        # -------- parameter_widgets------------#
        parameter_label = qtw.QLabel("Parameter")

        test_time_label = qtw.QLabel("Time")
        self.clocktime = qtw.QTimeEdit()
        test_date_label = qtw.QLabel("Date")
        self.date_time = qtw.QDateEdit()

        grob_fein_label = qtw.QLabel("Grobe")
        grob_fein_combo_box = qtw.QComboBox()


        vr_label = qtw.QLabel("Lame")
        self.vr_feuchte_input = qtw.QLineEdit()


        # leftvboxlayout
        left_vboxlayout = qtw.QVBoxLayout()

        left_vboxlayout.addStretch(1)

        left_vboxlayout.addWidget(test_time_label)
        left_vboxlayout.addWidget(self.clocktime)
        left_vboxlayout.addWidget(test_date_label)
        left_vboxlayout.addWidget(self.date_time)
        left_vboxlayout.addWidget(grob_fein_label)
        left_vboxlayout.addWidget(grob_fein_combo_box)
        left_vboxlayout.addWidget(vr_label)
        left_vboxlayout.addWidget(self.vr_feuchte_input)

        # centervboxlayout
        center_voboxlayout = qtw.QVBoxLayout()
        #
        # center_voboxlayout.addStretch()
        # center_voboxlayout.setStretchFactor()
        # center_voboxlayout.addSpacing()
        # center_voboxlayout.setStretchFactor()

        #
        # table_widget.setMinimumSize(90,80)

        center_voboxlayout.addWidget(table_widget)


        # righvobxlayout
        # buttons
        self.button_1 = qtw.QPushButton("Button 1")
        self.button_2 = qtw.QPushButton("Button 2")
        self.button_2 = qtw.QPushButton("Button 3")


        rightvboxlayout = qtw.QVBoxLayout()
        rightvboxlayout.addStretch(1)
        rightvboxlayout.addWidget(self.button_1)
        rightvboxlayout.addWidget(self.button_2)
        rightvboxlayout.addWidget(self.button_2)



        #
        #
        # Separador = qtw.QFrame()
        # # Separador.Shape(QFrame.HLine)
        # Separador.setFrameShape(qtw.QFrame.HLine)
        #
        # Separador.setSizePolicy(qtw.QSizePolicy.Minimum,qtw.QSizePolicy.Expanding)
        # Separador.setLineWidth(5)
        # # HPOUT1_layout = QVBoxLayout()
        # # HPOUT1_layout.addLayout(HPOUT1L_layout)
        # # HPOUT1_layout.addWidget(Separador)
        # # HPOUT1_layout.addLayout(HPOUT1R_layout)


        ## main layout
        self.qhboxlayout = qtw.QHBoxLayout()
        self.qhboxlayout.addLayout(left_vboxlayout)
        # self.qhboxlayout.addWidget(Separador)
        self.qhboxlayout.addLayout(center_voboxlayout)
        self.qhboxlayout.addLayout(rightvboxlayout)
        #
        # ### Main Grid

        # -------------------------------------------------- #
        selected_color = qtg.QColor(0,0,255)

        # self.setGeometry(300, 300, 1850, 950)
        self.setStyleSheet("background-color: {}")
        self.setLayout(self.qhboxlayout)

        self.show()


if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    w = Stretchme()
    sys.exit(app.exec_())
2 Answers

Try this :

you will decide how much space allocate for each layout, by the following way :

    self.qhboxlayout.addLayout(left_vboxlayout,20)
    self.qhboxlayout.addLayout(center_voboxlayout,80)
    self.qhboxlayout.addLayout(rightvboxlayout,20)

Your Code

import sys

from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
from PyQt5 import QtGui as qtg


class Stretchme(qtw.QWidget):
    def __init__(self):
        super().__init__()

        # # View
        table_widget = qtw.QTableWidget()


        # -----interface--widgets--------------------------#

        # -------- parameter_widgets------------#
        parameter_label = qtw.QLabel("Parameter")

        test_time_label = qtw.QLabel("Time")
        self.clocktime = qtw.QTimeEdit()
        test_date_label = qtw.QLabel("Date")
        self.date_time = qtw.QDateEdit()

        grob_fein_label = qtw.QLabel("Grobe")
        grob_fein_combo_box = qtw.QComboBox()


        vr_label = qtw.QLabel("Lame")
        self.vr_feuchte_input = qtw.QLineEdit()


        # leftvboxlayout
        left_vboxlayout = qtw.QVBoxLayout()

        left_vboxlayout.addStretch(1)

        left_vboxlayout.addWidget(test_time_label)
        left_vboxlayout.addWidget(self.clocktime)
        left_vboxlayout.addWidget(test_date_label)
        left_vboxlayout.addWidget(self.date_time)
        left_vboxlayout.addWidget(grob_fein_label)
        left_vboxlayout.addWidget(grob_fein_combo_box)
        left_vboxlayout.addWidget(vr_label)
        left_vboxlayout.addWidget(self.vr_feuchte_input)

        # centervboxlayout
        center_voboxlayout = qtw.QVBoxLayout()
        #
        # center_voboxlayout.addStretch()
        # center_voboxlayout.setStretchFactor()
        # center_voboxlayout.addSpacing()
        # center_voboxlayout.setStretchFactor()

        #
        # table_widget.setMinimumSize(90,80)

        center_voboxlayout.addWidget(table_widget)


        # righvobxlayout
        # buttons
        self.button_1 = qtw.QPushButton("Button 1")
        self.button_2 = qtw.QPushButton("Button 2")
        self.button_2 = qtw.QPushButton("Button 3")


        rightvboxlayout = qtw.QVBoxLayout()
        rightvboxlayout.addStretch(1)
        rightvboxlayout.addWidget(self.button_1)
        rightvboxlayout.addWidget(self.button_2)
        rightvboxlayout.addWidget(self.button_2)



        #
        #
        # Separador = qtw.QFrame()
        # # Separador.Shape(QFrame.HLine)
        # Separador.setFrameShape(qtw.QFrame.HLine)
        #
        # Separador.setSizePolicy(qtw.QSizePolicy.Minimum,qtw.QSizePolicy.Expanding)
        # Separador.setLineWidth(5)
        # # HPOUT1_layout = QVBoxLayout()
        # # HPOUT1_layout.addLayout(HPOUT1L_layout)
        # # HPOUT1_layout.addWidget(Separador)
        # # HPOUT1_layout.addLayout(HPOUT1R_layout)


        ## main layout
        self.qhboxlayout = qtw.QHBoxLayout()
        self.qhboxlayout.addLayout(left_vboxlayout,20)
        self.qhboxlayout.addLayout(center_voboxlayout,80)
        self.qhboxlayout.addLayout(rightvboxlayout,20)
        #
        # ### Main Grid

        # -------------------------------------------------- #
        selected_color = qtg.QColor(0,0,255)

        # self.setGeometry(300, 300, 1850, 950)
        self.setStyleSheet("background-color: {}")
        self.setLayout(self.qhboxlayout)

        self.show()


if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    w = Stretchme()
    sys.exit(app.exec_())

You have to set a stretch factor when adding the central layout:

# ...
self.qhboxlayout.addLayout(center_voboxlayout, stretch=1)
# ...

enter image description here

Related