2014-12-02 218 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