2016-06-01 19 views
0
datainputHbox = QHBoxLayout() 
layout = QVBoxLayout(self) 
layout.addLayout(datainputHbox) 


pagedatainputdeletboxbutton1.clicked.connect(lambda:self.boxdelete(datainputHbox)) 

def boxdelete(self, box): 

これはdatainputHboxフォームのレイアウトを除去するためにboxdelete目的球を書く方法のPyQtのproragm あるからレイアウトを削除します。私はたくさん試します。しかし、私はすべてのウィジェットを削除できますが、レイアウトを削除することはできません。PyQtはどのようにレイアウト

+0

はぁからboxdelete機能をクラッシュさせるのpythonを引き起こしました。私は本当に 'removeLayout'関数があると思いました... –

答えて

2

QLayoutsを削除するには、対応するQLayoutItemを削除して削除します。また、レイアウトへの参照を保存しておく必要があります。そうでない場合は、それらが属するウィジェットを知らない限り、後からアクセスすることはできません。一般的な答えとして

datainputHbox = QHBoxLayout() 
self.vlayout = QVBoxLayout(self) 
layout.addLayout(datainputHbox) 
pagedatainputdeletboxbutton1.clicked.connect(lambda: self.boxdelete(datainputHbox)) 

def boxdelete(self, box): 
    for i in range(self.vlayout.count()): 
     layout_item = self.vlayout.itemAt(i) 
     if layout_item.layout() == box: 
      self.vlayout.removeItem(layout_item) 
      return 
0

taken from hereわずかな、しかし重要な変更を伴う:あなたは()widget.deleteLaterを呼び出すべきではありません。少なくとも私の場合、これは

グローバル関数とともに

def deleteItemsOfLayout(layout): 
    if layout is not None: 
     while layout.count(): 
      item = layout.takeAt(0) 
      widget = item.widget() 
      if widget is not None: 
       widget.setParent(None) 
      else: 
       deleteItemsOfLayout(item.layout()) 

Brendan Abel's答え

def boxdelete(self, box): 
    for i in range(self.vlayout.count()): 
     layout_item = self.vlayout.itemAt(i) 
     if layout_item.layout() == box: 
      deleteItemsOfLayout(layout_item.layout()) 
      self.vlayout.removeItem(layout_item) 
      break 
関連する問題