Sator
Sator

Reputation: 776

change expanding space of nested layouts in pyqt

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_())

Upvotes: 3

Views: 1889

Answers (2)

Bala
Bala

Reputation: 686

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_())

Upvotes: 2

eyllanesc
eyllanesc

Reputation: 243907

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

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

enter image description here

Upvotes: 1

Related Questions