小部件之间的Pyqt5 addStretch?

时间:2017-11-01 19:55:24

标签: python pyqt pyqt5 qwidget qlayout

我正在使用QVBox布局,布局中有两个小部件和动态布局“layout2”。 Widget1固定在顶部Widget3固定在底部,widget2是动态小部件。每次都删除并添加layout2。这里的问题是我无法将widget3定位在底部,因为layout2布局被删除Widget3移动到顶部。下面是示例代码。

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

我尝试过addstretch,虚拟附加布局,没有任何效果。

1 个答案:

答案 0 :(得分:1)

如果您只想更改位于第二个位置的窗口小部件,则无需删除创建新布局,只需要重复使用它,在下面的示例中,我们将看到窗口小部件的更改方式:

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)