Qt - 动态创建窗口小部件

时间:2014-12-02 18:18:12

标签: python dynamic widget pyqt pyside

我正在制作这个计划。

它是一个简单的鼓乐,可以产生midi声音并播放它们。我还在设计部分。

我手动将所有小部件放在一起。

这是一项乏味的工作,我认为通过动态创建它们可以更快。

我怎样才能做到这一点?

正如您所看到的,我的代码看起来像一团糟:

self.kick_1 = QtGui.QCheckBox(self)
self.kick_2 = QtGui.QCheckBox(self)
self.kick_3 = QtGui.QCheckBox(self)
self.kick_4 = QtGui.QCheckBox(self)
self.kick_5 = QtGui.QCheckBox(self)
self.kick_6 = QtGui.QCheckBox(self)
self.kick_7 = QtGui.QCheckBox(self)
self.kick_8 = QtGui.QCheckBox(self)
self.kick_9 = QtGui.QCheckBox(self)
self.kick_10 = QtGui.QCheckBox(self)
self.kick_11 = QtGui.QCheckBox(self)
self.kick_12 = QtGui.QCheckBox(self)
self.kick_13 = QtGui.QCheckBox(self)
self.kick_14 = QtGui.QCheckBox(self)
self.kick_15 = QtGui.QCheckBox(self)
self.kick_16 = QtGui.QCheckBox(self)
self.kick_1.setGeometry(QtCore.QRect(120, 60, 16, 17))
self.kick_2.setGeometry(QtCore.QRect(150, 60, 16, 17))
self.kick_3.setGeometry(QtCore.QRect(180, 60, 16, 17))
self.kick_7.setGeometry(QtCore.QRect(300, 60, 16, 17))
self.kick_4.setGeometry(QtCore.QRect(210, 60, 16, 17))
self.kick_5.setGeometry(QtCore.QRect(240, 60, 16, 17))
self.kick_6.setGeometry(QtCore.QRect(270, 60, 16, 17))
self.kick_14.setGeometry(QtCore.QRect(510, 60, 16, 17))
self.kick_11.setGeometry(QtCore.QRect(420, 60, 16, 17))
self.kick_8.setGeometry(QtCore.QRect(330, 60, 16, 17))
self.kick_9.setGeometry(QtCore.QRect(360, 60, 16, 17))
self.kick_12.setGeometry(QtCore.QRect(450, 60, 16, 17))
self.kick_13.setGeometry(QtCore.QRect(480, 60, 16, 17))
self.kick_10.setGeometry(QtCore.QRect(390, 60, 16, 17))
self.kick_15.setGeometry(QtCore.QRect(540, 60, 16, 17))
self.kick_16.setGeometry(QtCore.QRect(570, 60, 16, 17))

所有这一切只是为了创建16个复选框并将它们并排放置(相隔30个像素)

2 个答案:

答案 0 :(得分:2)

首先,您可以使用列表来保留所有这些小部件,而不是那些“手动”命名的变量:

self.kicks = [QtGui.QCheckBox(self) for _ in xrange(16)]

其次,您应该认真考虑布局管理器。我还没有遇到过使用绝对定位的需要。例如。一个QHBoxLayout将在水平行中排列所有相邻的小部件,几乎就是你正在做的事情:

layout = QtGui.QHBoxLayout()
# add all the checkboxes
for kick in self.kicks:
    layout.addWidget(kick)
# tell your widget to actually use this layout
self.setLayout(layout)

答案 1 :(得分:0)

如果你需要继续绝对定位,你可以使用循环:

start_at_x = 120
step = 30
y = 60
for n in range(1,17):
    cb = QtGui.QCheckBox(self)
    cb.setGeometry(QtCore.QRect(start_at_x+(step*n), y, 16, 17))
    setattr(self, 'kick_%n' % n, cb)

但你也应该看看QT提供的layout options,因为它们提供了更大的灵活性。