我正在制作这个计划。
它是一个简单的鼓乐,可以产生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个像素)
答案 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,因为它们提供了更大的灵活性。