我有一个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_())
但是
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)
工作正常。
背后的原因是什么?
如果要手动指定窗口小部件的几何形状(位置和大小),则应不是将其添加到布局中。
您的第二个示例“有效”是因为您已经创建了顶层控件并将其设置为顶层窗口小部件(Window类),并且由于已经存在一个布局,因此第二个示例未“安装”。从控制台运行它会得到以下输出:
StdErr: QLayout: Attempting to add QLayout "" to Window "", which already has a layout
[将小部件添加到布局时,“ layout item”(布局用于管理其小部件的抽象项目)的所有权被转移到布局,并且该小部件重新关联到使用该布局的小部件。由于无法设置第二个布局,因此它将无法管理您尝试添加的项目的几何形状,结果是它们将保留您之前设置的几何形状。
如果您删除引用其他布局的所有最后一行,那正是您所需要的。另外,请注意,为了添加不受布局管理的窗口小部件,需要父项。您的最后一个示例也有效,因为您在实例化窗口时将窗口指定为父窗口。如果您不这样做,则按钮将不会显示; but如果您将其显示(使用show()
或setVisible(True)
),它们将分别出现在单独的窗口中,因为它们将成为它们自己的顶层窗口。
如果没有其他应由布局管理的窗口小部件,则也可以完全避免创建第一个布局(但仍然需要父级)。
最后,让我告诉您,通常不建议使用手动几何图形,并且在少数情况下,这是个好主意。造成这种情况的主要原因是小部件在不同设备之间的显示方式大不相同,并且取决于各个方面: