2013-11-04 1 views
1

내 목표는 QSpinbox에서 선택한 번호에 따라 QComboBoxes 사용자를 지정하는 것입니다.Python PyQt 스핀 상자에서 선택한 사용자 수에 따라 콤보 박스 만들기

그래서,이 같은 것을 할 것이다 :

사용자 내가 데이터를 입력하는 사용자에 대한 QComboBoxes을 만듭니다 또 다른 함수를 호출 할 신호 valueChanged(int)를 사용하여, 그 후, QSpinbox에 번호를 선택합니다.

사용자가 다른 값으로 변경되는 즉시. QSpinbox 값에 따라 QComboBox 숫자가 자동으로 증가/감소합니다. (. 예 : 3 ~ 4), 그것은 아무튼 그 사용자 수를 증가 스핀 상자에서 선택한 번호 사용자에 따라 선택 상자를 만들 수 있지만

def myfunction(x): 
    labellist = [] 
    combolist = [] 
    layoutlist = [] 
    layout = QtGui.QVBoxLayout() 
    for i in range(x): 
     labellist.append(QtGui.QLabel('this is label'+str(i)) 
     combolist.append(QtGui.QComboBox()) 
     layoutlist.append(QtGui.QHBoxLayout()) 
     layoutlist[i].addWidget(labellist[i]) 
     layoutlist[i].addWidget(combolist[i]) 
     layout.addLayout(layoutlist[i]) 


self.connect(number,QtCore.SIGNAL("valueChanged(int)"),myfunction) 

을 :

그래서 나는 이런 식으로 뭔가를 내놓았다 이전 3comboBoxes를 제거하지 말고 대신 7 개의 콤보 상자가됩니다.

어떻게 수정합니까? 아니면 비슷한 결과를 얻을 수있는 더 좋은 방법이 있습니까?

답변

2

스핀 상자 값이 변경 될 때마다 모든 콤보 박스를 삭제하고 다시 만들 수 있습니다. 가장 효율적인 것은 아니지만 매우 간단합니다.

레이블/comboxes에 대한 참조가있는 목록 만 있으면됩니다. 슬롯에 각 항목의 deleteLater()으로 전화 한 다음 목록을 []으로 설정하여 참조를 삭제하십시오. 마지막으로 항목을 다시 만들고 레이아웃에 추가하고 목록을 다시 채 웁니다.

또한 New Style Signals and Slots을 확인해야합니다. 그들은 못생긴 C++ 스타일 연결보다 좋네요.

class DynamicComboBoxes(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(DynamicComboBoxes, self).__init__(parent) 
     vbox = QtGui.QVBoxLayout(self) 
     spinbox = QtGui.QSpinBox(self) 
     spinbox.setRange(0,10) 
     spinbox.valueChanged.connect(self.onChangeValue) 
     vbox.addWidget(spinbox) 
     self.grid = QtGui.QGridLayout() 
     self.itemlist = [] 
     vbox.addLayout(self.grid) 
     vbox.addStretch(1) 


    def onChangeValue(self, val): 
     for label, combobox in self.itemlist: 
      label.deleteLater() 
      combobox.deleteLater() 
     self.itemlist = [] 
     for i in range(val): 
      label = QtGui.QLabel('This is Label {}'.format(i)) 
      combobox = QtGui.QComboBox() 
      self.grid.addWidget(label, i, 0) 
      self.grid.addWidget(combobox, i, 1) 
      self.itemlist.append([label, combobox]) 
관련 문제