[英]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_())
但
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 has a layout
当小部件添加到布局时,“布局项”(布局用于管理其小部件的抽象项目)的所有权将转移到布局,并且小部件重新成为使用该布局的小部件的父级。
由于无法设置第二个布局,因此它不会管理您尝试添加的项目的几何图形,结果它们将保留您之前设置的几何图形。
如果您删除引用其他布局的所有最后一行,则可以获得相同的结果,这正是您所需要的。
另请注意,为了添加不受布局管理的小部件,需要父级。 您的最后一个示例也有效,因为您在实例化它们时将窗口指定为父窗口; 如果您不这样做,按钮将不会显示,但如果您确实显示它们(使用show()
或setVisible(True)
),它们将分别出现在单独的窗口中,因为它们将成为自己的顶级窗口。
如果您没有其他应由布局管理的小部件,您也可以完全避免创建第一个布局(但仍然需要父布局)。
最后,让我告诉您,通常不鼓励使用手动几何图形,并且在极少数特定情况下使用它是个好主意。
这背后的主要原因是小部件在不同设备之间的显示方式往往非常不同,这取决于各个方面:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.