2014-09-03 4 views
0

(CheckBox의) GridLayout 및 HLayout의 누적 레이아웃으로 대화 상자를 생성하려고합니다. 글쎄, 그랬어. 하지만 내 그리드 (내 HLayout 괜찮아요) 큰있어하지만 지금은 너무 많은 부동산을 차지하지 않는 ScrollArea 싶어요. 나는 다음과 같은 코드를 시도했다 .... 그리고 그것은 스크롤보기를 생성하지만, 스크롤보기의 크기는 HLayout의 버튼 (첫 번째 ofc)의 크기이다. 스크롤 뷰를 Dialog의 너비로하고 싶습니다.이 너비는 명목상 HLayout의 최소 너비입니다. 또한 scroll_view 및 scroll_viewWidget을 추가하면 QLayout 예외가 발생하고 QLayout :: addChildLayout : layout "은 이미 상위가 있습니다. 어떤 생각이야?Python PyQt QScrollArea 및 QGridLayout (또는 any?)

class checkboxDialog(QtGui.QDialog) : 

def __init__(self, headers, name) : 
    super(checkboxDialog, self).__init__() 

    self.checkerLayout = QtGui.QVBoxLayout() 
    self.checkerLayout.setMargin(1) 
    self.checkerLayout.setSpacing(2) 

    self.scroll_view = QtGui.QScrollArea(self) 
    self.scroll_view.setWidgetResizable(True) 

    self.scroll_viewWidget = QtGui.QWidget() 
    self.scroll_viewWidget.setGeometry(QtCore.QRect(0, 0, 600, 400)) 
    self.scroll_view.setWidget(self.scroll_viewWidget)   

    self.checkerHlayout = QtGui.QHBoxLayout(self.scroll_viewWidget) 

    checksLayout = QtGui.QGridLayout() 
    checksLayout.setColumnStretch(90,7) 
    checksLayout.setMargin(1) 
    checksLayout.setSpacing(2)  
    self.cbList = [] 
    index = 0 
    for row_index in range(90): 
     for column_index in range(7): 
      if index > len(headers)-1 : break 
      checkbox = QtGui.QCheckBox(headers[index][0:8], self) 
      checkbox.setToolTip("Chanel = {}".format(headers[index])) 
      self.cbList.append(checkbox) 
      # Hide the Phase channels for now ... not sure I shoudl even build the CheckBoxes 
      # But if I dont then the len(cbList) < len(data[0]) 
      if headers[index][-1] == 'p' : 
       checkbox.hide() 
      checksLayout.addWidget(checkbox, row_index, column_index) 
      index += 1 

    self.checkerHlayout.addLayout(checksLayout) 

    self.buttonLayout = QtGui.QHBoxLayout() 
    self.buttonLayout.setMargin(1) 
    self.buttonLayout.setSpacing(2) 

    applyButton = QtGui.QPushButton("Apply") 
    nextButton = QtGui.QPushButton("Next") 
    nextAllButton = QtGui.QPushButton("NextAll") 
    prevButton = QtGui.QPushButton("Prev") 
    prevAllButton = QtGui.QPushButton("PrevAll") 
    clearButton = QtGui.QPushButton("Clear") 

    self.buttonLayout.addWidget(applyButton)   
    self.buttonLayout.addWidget(nextButton) 
    self.buttonLayout.addWidget(nextAllButton) 
    self.buttonLayout.addWidget(prevButton) 
    self.buttonLayout.addWidget(prevAllButton) 
    self.buttonLayout.addWidget(clearButton) 

    self.checkerLayout.addLayout(self.checkerHlayout) 
    self.checkerLayout.addLayout(self.buttonLayout) 
    self.setLayout(self.checkerLayout) 

    self.setObjectName(name) 
    self.setWindowTitle(name) 

    self.connect(applyButton, QtCore.SIGNAL('clicked()'), self.checked) 
    self.connect(nextButton, QtCore.SIGNAL('clicked()'), self.next_chn) 
    self.connect(nextAllButton, QtCore.SIGNAL('clicked()'), self.next_chnAll) 
    self.connect(prevButton, QtCore.SIGNAL('clicked()'), self.prev_chn) 
    self.connect(prevAllButton, QtCore.SIGNAL('clicked()'), self.prev_chnAll) 
    self.connect(clearButton, QtCore.SIGNAL('clicked()'), self.clear_chn) 

답변

1

나는 이것이 당신이 원하는 것을 생각 :

self.w2 = QtGui.QWidget(self) 
    self.w2.setLayout(self.buttonLayout) 
    self.checkerLayout.addWidget(self.w2) 
    self.checkerLayout.addWidget(self.scroll_view) 
    self.setLayout(self.checkerLayout) 

+0

네 (addLayout 계산서를 가진 블록을 교체)! 그게 그랬어 ... 왜 그런지 이해가 안된다고 미안해. –

+0

@TimCarnahan 당신은'checkerLayout'에'addLayout'을 두 번 불렀습니다. 아마도 당신이 원했던 레이아웃을 중첩시킨 것입니다. – Trilarion

+0

그런데 복잡한 GUI를 만들기 위해 QtDesigner를 사용하는 것이 좋으며, 런타임에 일부 요소를 동적으로 채워야하는 경우에도 많은 어려움을 겪습니다. – mdurant