Pyqt5 addStretch in between widgets?

2019-08-19 00:51发布

问题:

I am using a QVBox layout and there are two widgets and a dynamic layout 'layout2' in the layout. Widget1 is fixed on top Widget3 is fixed at the bottom and widget2 is dynamic widget. layout2 is deleted and added each time. The problem here is I am not able to position the widget3 at the bottom as layout2 layout is deleted Widget3 moves to the top. Below is the sample code.

class Screen(QWidget):
    def __init__(self):            
        super(Screen, self).__init__()

        self.main_layout = QVBoxLayout()
        widget1 = QPushButton("Text1")
        #self.widget2 = QWidget()
        widget3 = QLabel("Text3")
        self.widget2_layout = QHBoxLayout()
        widget2_label = QLabel("text2")
        self.widget2_layout.addWidget(widget2_label)
        #self.widget2.setLayout(self.widget2_layout)
        self.main_layout.addWidget(widget1,Qt.AlignTop)
        self.main_layout.addLayout(self.widget2_layout)
        self.main_layout.addWidget(widget3,Qt.AlignBottom)
        widget1.clicked.connect(self.change_widget2)    
        self.setLayout(self.main_layout)    
        self.show()

    def clearLayout(self,layout):
        item = layout.takeAt(0)
        while item:
            w = item.widget()
            if w:
                w.deleteLater()
            lay = item.layout()
            if lay:
                self.clearLayout(item.layout())
            item = layout.takeAt(0)
    def change_widget2(self):
        self.clearLayout(self.widget2_layout)
        self.widget2_layout = QHBoxLayout()
        widget2_label = QLabel("text changed")
        self.widget2_layout.addWidget(widget2_label)
        self.main_layout.addLayout(self.widget2_layout)

app = QApplication(sys.argv)
Gui = Screen()
sys.exit(app.exec_())

I have tried addstretch, dummy additional layout and nothing worked.

回答1:

If you only want to change the widget that is in the second position it is not necessary to delete create a new layout, it is only necessary to reuse it, in the following example we see how the widget is changing:

class Screen(QWidget):
    def __init__(self):
        super(Screen, self).__init__()
        self.setLayout(QVBoxLayout())

        widget1 = QPushButton("Text1", self)
        widget3 = QLabel("Text3", self)

        self.widget2_layout = QHBoxLayout()
        self.change_widget2()

        self.layout().addWidget(widget1)
        self.layout().addLayout(self.widget2_layout)
        self.layout().addWidget(widget3)

        widget1.clicked.connect(self.change_widget2)

    def clearLayout(self, layout):
        item = layout.takeAt(0)
        while item:
            w = item.widget()
            if w:
                w.deleteLater()
            lay = item.layout()
            if lay:
                self.clearLayout(item.layout())
            item = layout.takeAt(0)

    def change_widget2(self):
        self.clearLayout(self.widget2_layout)

        # change the widget.
        import random
        widgets = [QLabel, QLineEdit, QPushButton]
        widget2 = widgets[random.randint(0, len(widgets)-1)]("widget2", self)

        self.widget2_layout.addWidget(widget2)