简体   繁体   中英

PyQt5 QWidget.setGeometry() not working for QLabel

I'm working on a very simple app in PyQt5 for displaying and sorting images. I'm new to Python and Qt in particular, and I've been having a few problems. I'm trying to display QPixmap images within QLabel objects, and they display properly. However, they're lined up in a row as default and I can't figure out how to move them.

(I know the code is terrible but I'm trying to get it working before I make it clean.)

Here is my code:

class ImageClassifier(QtWidgets.QWidget):

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):

        hbox = QtWidgets.QHBoxLayout(self)

        mainImg = QPixmap("img.png")
        xmplImg0 = QPixmap("img0.png")
        xmplImg1 = QPixmap("img1.png")
        xmplImg2 = QPixmap("img2.png")
        xmplImg3 = QPixmap("img3.png")

        lbl = QtWidgets.QLabel(self)
        lbl0 = QtWidgets.QLabel(self)
        lbl1 = QtWidgets.QLabel(self)
        lbl2 = QtWidgets.QLabel(self)
        lbl3 = QtWidgets.QLabel(self)

        lbl.setPixmap(mainImg)
        lbl0.setPixmap(xmplImg0)
        lbl1.setPixmap(xmplImg1)
        lbl2.setPixmap(xmplImg2)
        lbl3.setPixmap(xmplImg3)

        hbox.addWidget(lbl)
        hbox.addWidget(lbl0)
        hbox.addWidget(lbl1)
        hbox.addWidget(lbl2)
        hbox.addWidget(lbl3)

        lbl0.setGeometry(30, 30, 30, 30)

        self.setLayout(hbox)
        self.move(300, 200)
        self.setWindowTitle('Fruit Classifier')
        self.show()

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    ic = ImageClassifier()
    sys.exit(app.exec_())

The lbl0.setGeometry() function isn't doing anything at all and I don't have a clue why. Does anyone know of a way to fix this, or a better way to set the position of a QLabel object?

Follow the following bullets.

  • When you add something to a QHBoxLayout/QVBoxLayout... you also have to set the geometry of your BoxLayout as well, not just of one element inside it.
  • Everything you throw inside a BoxLayout it will adjust to it's parent(BoxLayout).
  • Try setting the geometry of all your elements.
  • Try setting the geometry of your BoxLayout
  • If still doesn't work try setting ".setFixedSize(_width,_height)" also for all elements & BoxLayout, as you need.

[Update] Look what I'm trying to say. Better with a example:

If you use a BoxLayout the position of your objects won't obey what you want. It will follow the BoxLayout policy. You also passed (self) for the QLabels what makes the QWidget its parent. That's a mess.

Check it out the following code. I have no BoxLayout and I just said who is my(Qlabel)'s parent. So I'll behave as my "daddy" says. So now you can move it along.

import sys
from PyQt5 import QtWidgets


class ImageClassifier(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):

        self.setFixedSize(500,500)

        lbl = QtWidgets.QLabel(self)
        lbl.setFixedSize(50,50)
        lbl0 = QtWidgets.QLabel(self)
        lbl0.setFixedSize(50, 50)
        lbl1 = QtWidgets.QLabel(self)
        lbl1.setFixedSize(50, 50)
        lbl2 = QtWidgets.QLabel(self)
        lbl2.setFixedSize(50, 50)
        lbl3 = QtWidgets.QLabel(self)
        lbl3.setFixedSize(50, 50)

        lbl.setStyleSheet("""background-color: red;""")
        lbl0.setStyleSheet("""background-color: green;""")
        lbl1.setStyleSheet("""background-color: blue;""")
        lbl2.setStyleSheet("""background-color: yellow;""")
        lbl3.setStyleSheet("""background-color: black;""")

        lbl0.move(50,50)
        lbl1.move(100, 100)
        lbl2.move(150, 150)
        lbl3.move(150, 150)

        self.move(300, 200)
        self.setWindowTitle('Fruit Classifier')
        self.show()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ic = ImageClassifier()
    sys.exit(app.exec_())

That's just a simple way to do it. You better create your own Label that inherit QLabel. And personalize as you wish.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM