繁体   English   中英

将 pyqt 按钮移出按钮列表

[英]Move pyqt button out of list of buttons

我有一个 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_())

不适用于指定位置图 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)

工作正常。

图 2

背后的原因是什么?

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

您的第二个示例“有效”只是因为您已经为顶级小部件(Window 类)创建并设置了布局,并且由于布局已经存在,因此第二个没有“安装”。 从控制台运行它会显示这个错误:

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

当小部件添加到布局时,“布局项”(布局用于管理其小部件的抽象项目)的所有权将转移到布局,并且小部件重新成为使用该布局的小部件的父级。

由于无法设置第二个布局,因此它不会管理您尝试添加的项目的几何图形,结果它们将保留您之前设置的几何图形。

如果您删除引用其他布局的所有最后一行,则可以获得相同的结果,这正是您所需要的。

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

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

最后,让我告诉您,通常不鼓励使用手动几何图形,并且在极少数特定情况下使用它是个好主意。
这背后的主要原因是小部件在不同设备之间的显示方式往往非常不同,这取决于各个方面:

  • 不同的操作系统和操作系统版本以不同的方式绘制小部件(有时非常显着),这涉及改变小部件的大小和行为; 虽然这对于简单的小部件来说可能不是一个主要问题,但对于项目视图、旋转框等来说可能是一个问题;
  • 不同的操作系统和系统使用不同的样式,其中还包括内部小部件内容边距和最小尺寸等;
  • 特定的系统设置(最重要的是,默认字体)可能会使小部件大多不可读,特别是如果字体太大,文本会被剪裁在小部件的边距内;
  • 根据操作系统的不同,如果系统使用高 DPI 显示器,您可能会遇到问题,并且最终可能会出现几乎无法与之交互的非常小的小部件;
  • 固定几何形状迫使您(和用户)具有固定的小部件/窗口大小,并且(以及上面的 DPI 问题)这可能是一个问题:同一个小部件可能看起来太大或太小;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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