2012-06-23 4 views
4

pyqt의 레이아웃에 문제가 있습니다. 레이아웃에서 항목을 닫은 후에도 여전히 layout.count()가 이전 항목 수를 반환합니다. 그래서 .close() 정말 레이아웃에서 항목을 제거하지 생각하십시오. 다음은 완전한 작동 예제입니다.pyqt의 레이아웃에서 항목을 제거하는 가장 좋은 방법은 무엇입니까

import sys 
from PyQt4 import QtGui,QtCore 
class LayoutTest(QtGui.QWidget): 
    def __init__(self): 
     super(LayoutTest, self).__init__() 
     self.vvbox = QtGui.QVBoxLayout() 
     self.dvbox = QtGui.QVBoxLayout() 
     vbox = QtGui.QVBoxLayout() 
     vbox.addLayout(self.vvbox) 
     vbox.addLayout(self.dvbox) 
     self.setLayout(vbox) 

     self.add_button = QtGui.QPushButton("Add Items") 
     self.edit_button = QtGui.QPushButton("Remove Items") 
     self.chk_button = QtGui.QPushButton("Check Items") 

     self.vvbox.addWidget(self.add_button) 
     self.vvbox.addWidget(self.edit_button) 
     self.vvbox.addWidget(self.chk_button) 

     self.connect(self.add_button, QtCore.SIGNAL("clicked()"), self.addButtons) 
     self.connect(self.edit_button, QtCore.SIGNAL("clicked()"), self.removeButtons) 
     self.connect(self.chk_button, QtCore.SIGNAL("clicked()"), self.checkItems) 

     self.setGeometry(300, 200, 400, 300) 

    def keyPressEvent(self, event): 
     if event.key() == QtCore.Qt.Key_Escape: 
      self.close() 

    def addButtons(self): 
     for i in range(0, 5): 
      self.r_button = QtGui.QPushButton("Button %s " % i) 
      self.dvbox.addWidget(self.r_button) 

    def removeButtons(self): 
     for cnt in range(self.dvbox.count()): 
      self.dvbox.itemAt(cnt).widget().close() 

    def checkItems(self): 
     QtGui.QMessageBox.information(self, 'Count',"You have %s Items in Layout" % self.dvbox.count(), QtGui.QMessageBox.Ok) 

def run(): 

    app = QtGui.QApplication(sys.argv) 
    ex = LayoutTest() 
    ex.show() 
    sys.exit(app.exec_()) 

if __name__ == "__main__": 
    run() 

버튼을 두 번 클릭하면 버튼이 삭제됩니다. 그런 다음 항목을 확인하십시오. 닫은 후에도 레이아웃에 n 개의 항목이 생깁니다.

그래서 닫는 것 이외의 레이아웃에서 위젯을 제거하는 가장 좋은 방법은 무엇입니까?

+0

나는 해결책을 찾았지만 얼마나 효율적인지 알지 못했습니다. 범위 (계수기)에 대한 CNT 카운터 = self.dvbox.count() : 여기 내 용액 데프 removeButtons (자기)이다 self.dvbox.itemAt = w (self.dvbox.count() - 1) .widget() self.dvbox.removeWidget (w) w.close() – Achayan

답변

8

귀하의 의견은 실제로 해결책이지만 close 대신 deleteLater을 사용하십시오. 그것은 더 안전합니다. 약간의 수정을 통해 다음과 같이 메서드를 다시 작성합니다.

def removeButtons(self): 
    for cnt in reversed(range(self.dvbox.count())): 
     # takeAt does both the jobs of itemAt and removeWidget 
     # namely it removes an item and returns it 
     widget = self.dvbox.takeAt(cnt).widget() 

     if widget is not None: 
      # widget will be None if the item is a layout 
      widget.deleteLater() 
+0

완벽합니다.이 방법은 훨씬 깨끗합니다. 감사합니다. Avaris – Achayan

관련 문제