【问题标题】:PyQt5 QWidget.setGeometry() not working for QLabelPyQt5 QWidget.setGeometry() 不适用于 QLabel
【发布时间】:2017-03-07 16:22:44
【问题描述】:

我正在 PyQt5 中开发一个非常简单的应用程序,用于显示和排序图像。我是 Python 和 Qt 的新手,尤其是我遇到了一些问题。我正在尝试在 QLabel 对象中显示 QPixmap 图像,并且它们显示正确。但是,它们默认排成一排,我不知道如何移动它们。

(我知道代码很糟糕,但我想在清理之前让它工作。)

这是我的代码:

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

lbl0.setGeometry() 函数根本没有做任何事情,我不知道为什么。有谁知道解决这个问题的方法,或者设置 QLabel 对象位置的更好方法?

【问题讨论】:

  • 看起来您设置的几何图形小于最小尺寸,因此几何图形被忽略。
  • 哦,抱歉,我在发帖前一秒钟添加了这一点,试图修复它。没有那条线,它仍然不起作用。我将编辑以删除该行。

标签: python qt layout pyqt pyqt5


【解决方案1】:

遵循以下要点。

  • 当您向 QHBoxLayout/QVBoxLayout 添加某些内容时...您还必须设置 BoxLayout 的几何形状,而不仅仅是其中的一个元素。
  • 您在 BoxLayout 中放置的所有内容都会根据其父级 (BoxLayout) 进行调整。
  • 尝试设置所有元素的几何形状。
  • 尝试设置 BoxLayout 的几何形状
  • 如果仍然不起作用,请尝试根据需要为所有元素和 BoxLayout 设置“.setFixedSize(_width,_height)”。

[更新] 看看我想说什么。举个例子更好:

如果您使用 BoxLayout,您的对象的位置将不会符合您的要求。它将遵循 BoxLayout 策略。您还为 QLabels 传递了 (self) 是什么使 QWidget 成为其父级。真是一团糟。

查看以下代码。 我没有 BoxLayout,我只是说谁是我(Qlabel)的父母。所以我会像我的“爸爸”说的那样行事。所以现在你可以移动它了。

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

这只是一种简单的方法。您最好创建自己的继承 QLabel 的标签。并根据需要进行个性化设置。

【讨论】:

  • 只是一些提示。您还可以使用 BoxLayout 提供的其他一些功能,例如 setSpacing(_space)。设置项目之间的空间。还 setContentMargins(_left,_top,_right,_bottom) 设置整个 BoxLayout 的边距。如果您想为每个项目设置边距,那么您可以在每个元素中使用 setContentMargins(QLabel) ...
  • 非常感谢,但我没有把问题解释清楚。我实际上不需要调整元素的大小,我只需要移动它们。 setSpacing() 函数有效,但我不想水平间隔它们,我试图将 lbl0、1、2、3 移动到 lbl 对象下。 setGeometry 没有做任何事情,据我所知 setContentMargins 也没有。随意下载代码并尝试一下。也许我做错了什么。这是我当前的代码:paste.ee/p/Dc4KA
  • 我不认为你明白我想说什么。再看看,我刚刚更新了它:D
  • 关于 .setStyleSheet("")。试试看下面的链接,对你有很大帮助!! link
  • 抱歉忘记链接link@YetAnotherQuack
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 2019-11-14
  • 1970-01-01
相关资源
最近更新 更多