Wrong widget order using vbox layout PyQt

586 Views Asked by At

I am trying to put a QLabel widget on top of (ie before) a QLineEdit widget edit.

But it keeps appearing after the QLineEdit widget. My code,

class CentralWidget(QtGui.QWidget):

    def __init__(self, parent=None):
        super(CentralWidget, self).__init__(parent)

        # set layouts
        self.layout = QtGui.QVBoxLayout(self)

        # Flags
        self.randFlag = False        
        self.sphereFlag = False
        self.waterFlag = False

        # Poly names
        self.pNames = QtGui.QLabel("Import file name", self) # label concerned
        self.polyNameInput = QtGui.QLineEdit(self)           # line edit concerned

        # Polytype selection
        self.polyTypeName = QtGui.QLabel("Particle type", self)
        polyType = QtGui.QComboBox(self)
        polyType.addItem("")
        polyType.addItem("Random polyhedra")
        polyType.addItem("Spheres")
        polyType.addItem("Waterman polyhedra")
        polyType.activated[str].connect(self.onActivated)

        self.layout.addWidget(self.pNames)
        self.layout.addWidget(self.polyNameInput)
        self.layout.addWidget(self.pNames)
        self.layout.addWidget(self.polyTypeName)
        self.layout.addWidget(polyType)
        self.layout.addStretch()

    def onActivated(self, text):
        # Do loads of clever stuff that I'm not at liberty to share with you

class Polyhedra(QtGui.QMainWindow):

    def __init__(self):

        super(Polyhedra, self).__init__()

        self.central_widget = CentralWidget(self)
        self.setCentralWidget(self.central_widget)

        # Set up window        
        self.setGeometry(500, 500, 300, 300)
        self.setWindowTitle('Pyticle')
        self.show()

    # Combo box
    def onActivated(self, text):

        self.central_widget.onActivated(text)

def main():

    app = QtGui.QApplication(sys.argv)
    poly = Polyhedra()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

The window I get is below.

What am I missing? I thought QVbox allowed to stack things vertically in the order that you add the items to the main widget. (Are these sub-widget objects called widgets?)

The window I get,

1

There are 1 best solutions below

1
On BEST ANSWER

The problem is because you are adding self.pNames label to layout twice.

#portion of your code
... 
self.layout.addWidget(self.pNames)        # here 
self.layout.addWidget(self.polyNameInput)
self.layout.addWidget(self.pNames)         # and here
self.layout.addWidget(self.polyTypeName)
self.layout.addWidget(polyType)
self.layout.addStretch()
...

The first time you add the QLabel, it gets added before the LineEdit and when you add it second time, it just moves to the bottom of LineEdit. This happens because there is only one object of QLabel which is self.pNames. It can be added to only one location. If you want to use two labels, consider creating two separate objects of QLabel