2014-12-02 177 views
0

我正在处理这个程序。Qt - 动态创建控件

这是一个简单的鼓生成器,可以产生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

首先,你可以使用一个列表,以保持所有这些小部件,而不是那些“手动”命名变量:

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) 
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