2017-02-08 8 views
1

setup_controls()関数を2回実行すると、アプリケーションがクラッシュするのはなぜですか?関数を2回実行するとPydideがクラッシュする

デザインで重要などこかに「親/自己」がないのですか?

enter image description here

import sys 
from PySide import QtGui, QtCore 

class QCategoryButton(QtGui.QPushButton): 
    def __init__(self, Text, treeitem, parent=None): 
     super(QCategoryButton, self).__init__(Text, parent) 
     self.treeitem = treeitem 

    def mousePressEvent(self, event): 
     mouse_button = event.button() 
     if mouse_button == QtCore.Qt.LeftButton: 
      self.treeitem.setExpanded(not self.treeitem.isExpanded()) 

class Example(QtGui.QWidget): 

    def __init__(self,): 
     super(Example, self).__init__() 

     self.initUI() 

    def initUI(self): 

     # formatting 
     self.resize(300, 300) 
     self.setWindowTitle("Example") 

     # widgets 
     self.ui_treeWidget = QtGui.QTreeWidget() 
     self.ui_treeWidget.setRootIsDecorated(False) 
     self.ui_treeWidget.setHeaderHidden(True) 
     self.ui_treeWidget.setIndentation(0) 

     self.setup_controls() 
     # self.setup_controls() 

     # layout 
     self.mainLayout = QtGui.QGridLayout(self) 
     self.mainLayout.addWidget(self.ui_treeWidget) 
     self.show()  

    def setup_controls(self): 
     # Add Category 
     pCategory = QtGui.QTreeWidgetItem() 
     self.ui_treeWidget.addTopLevelItem(pCategory) 
     self.ui_toggler = QCategoryButton('Settings', pCategory) 
     self.ui_treeWidget.setItemWidget(pCategory, 0, self.ui_toggler) 

     pFrame = QtGui.QFrame(self.ui_treeWidget) 
     pLayout = QtGui.QVBoxLayout(pFrame) 
     self.ui_ctrl = QtGui.QPushButton('Great') 
     self.ui_ctrlb = QtGui.QPushButton('Cool') 
     pLayout.addWidget(self.ui_ctrl) 
     pLayout.addWidget(self.ui_ctrlb) 

     pContainer = QtGui.QTreeWidgetItem() 
     pContainer.setDisabled(False) 
     pCategory.addChild(pContainer) 
     self.ui_treeWidget.setItemWidget(pContainer, 0, pFrame) 

# Main 
# ------------------------------------------------------------------------------ 
if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 

答えて

1

setItemWidget方法は、それに渡されたウィジェットの所有権を取得します。参照を保持しないと、Pythonによってガベージコレクションされる可能性があります。しかしもちろん、QtはPythonについて何も知らないので、それはもはやそこにないウィジェットにアクセスしようとすると...ブーム!これは問題の行である

:第二の呼び出しで

self.ui_toggler = QCategoryButton('Settings', pCategory) 

(Pythonの側)が保持他の基準がないため、self.ui_togglerに記憶された前回のウィジェットが削除されます。代わりに、これを行う必要があります:

ui_toggler = QCategoryButton('Settings', pCategory, self) 
    self.ui_treeWidget.setItemWidget(pCategory, 0, ui_toggler) 
関連する問題