将pyqt按钮从按钮列表中移出

问题描述 投票:1回答:1

我有一个pyqt4按钮列表,想移动位置。由于麻烦,它会使许多按钮变为变量,所以我通过列表创建它们。下面的代码

import sys
from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QVBoxLayout

class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        layout = QVBoxLayout(self)

        self.buttons = []
        for i in range(3):
            self.buttons.append(QPushButton('',self))
            self.buttons[-1].setFixedWidth(50)
            self.buttons[-1].setFixedHeight(50)
            self.buttons[-1].move(70*i+50,300)
            layout.addWidget(self.buttons[-1])


if __name__ == '__main__':

    import sys
    app = QApplication(sys.argv)
    window = Window()
    window.resize(500,500)
    window.show()
    sys.exit(app.exec_())

不适用于指定职位Image 1

但是

class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        layout = QVBoxLayout(self)

        self.button1 = QPushButton('',self)
        self.button1.setFixedWidth(50)
        self.button1.setFixedHeight(50)
        self.button1.move(50,300)

        self.button2 = QPushButton('',self)
        self.button2.setFixedWidth(50)
        self.button2.setFixedHeight(50)
        self.button2.move(120,300)

        self.button3 = QPushButton('',self)
        self.button3.setFixedWidth(50)
        self.button3.setFixedHeight(50)
        self.button3.move(190,300)

        layout = QVBoxLayout(self)
        layout.addWidget(self.button1)
        layout.addWidget(self.button2)
        layout.addWidget(self.button3)

工作正常。

Image 2

背后的原因是什么?

python pyqt pyqt5
1个回答
0
投票

如果要手动指定窗口小部件的几何形状(位置和大小),则应不是将其添加到布局中。

您的第二个示例“有效”是因为您已经创建了顶层控件并将其设置为顶层窗口小部件(Window类),并且由于已经存在一个布局,因此第二个示例未“安装”。从控制台运行它会得到以下输出:

StdErr: QLayout: Attempting to add QLayout "" to Window "", which already has a layout

[将小部件添加到布局时,“ layout item”(布局用于管理其小部件的抽象项目)的所有权被转移到布局,并且该小部件重新关联到使用该布局的小部件。由于无法设置第二个布局,因此它将无法管理您尝试添加的项目的几何形状,结果是它们将保留您之前设置的几何形状。

如果您删除引用其他布局的所有最后一行,那正是您所需要的。另外,请注意,为了添加不受布局管理的窗口小部件,需要父项。您的最后一个示例也有效,因为您在实例化窗口时将窗口指定为父窗口。如果您不这样做,则按钮将不会显示; but如果您将其显示(使用show()setVisible(True)),它们将分别出现在单独的窗口中,因为它们将成为它们自己的顶层窗口。

如果没有其他应由布局管理的窗口小部件,则也可以完全避免创建第一个布局(但仍然需要父级)。

最后,让我告诉您,通常不建议使用手动几何图形,并且在少数情况下,这是个好主意。造成这种情况的主要原因是小部件在不同设备之间的显示方式大不相同,并且取决于各个方面:

  • 不同的OS和OS版本绘制控件的方式有所不同(有时会很大),这涉及到更改控件的大小和行为;尽管对于简单的小部件而言这可能不是主要问题,但对于项目视图,旋转框等而言却可能是一个问题;
  • 不同的操作系统和系统使用不同的样式,其中还包括内部窗口小部件内容边距和最小尺寸;
  • 特定的系统设置(最重要的是,默认字体)可能会使小部件几乎不可读,特别是如果字体太大,则文本会在小部件的空白处被剪切;
  • 取决于操作系统,如果系统使用高DPI显示器,您可能会遇到问题,并且最终可能会得到非常小的微件,几乎无法与之交互;
  • 固定的几何形状迫使您(和用户)具有固定的小部件/窗口大小,并且(连同上面的DPI问题一起,这可能是一个问题:同一小部件​​看起来可能太大或太小;
© www.soinside.com 2019 - 2024. All rights reserved.