import sys from PySide import QtCore, QtGui from PySide.QtCore import Qt import gc class TableModel(QtCore.QAbstractTableModel): def __init__(self, parent=None): super().__init__(parent) self.foo = "foo" def rowCount(self, index): return 1000 if not index.isValid() else 0 def columnCount(self, index): return 1000 if not index.isValid() else 0 def data(self, index, role): if index.isValid() and role == Qt.DisplayRole: # return self.foo return str((index.row(), index.column())) else: return None def headerData(self, col, orientation, role): return self.foo def flags(self, index): f = QtCore.Qt.ItemIsEnabled return f def __del__(self): print("Deleted {0}".format(self.__class__)) class TableView(QtGui.QTableView): def __del__(self): print("Deleted {0}".format(self.__class__)) def closeEvent(self, event): self.setParent(None) gc.collect() class MainWidget(QtGui.QWidget): def __init__(self, parent = None): super().__init__(parent) self.setLayout(QtGui.QHBoxLayout()) self.pop_tree = QtGui.QPushButton("Pop") self.pop_tree.clicked.connect(self.onPop) self.layout().addWidget(self.pop_tree) def onPop(self): # if hasattr(self, "model"): # self.model.setParent(None) # self.tableView.setParent(None) # del self.model # del self.tableView tableView = TableView(self) model = TableModel(tableView) tableView.setModel(model) tableView.setWindowFlags(QtCore.Qt.Window) tableView.show() def main(): app = QtGui.QApplication(sys.argv) # model = TableModel() # tableView = QtGui.QTableView() # tableView.setModel(model) # tableView.show() widget = MainWidget() widget.show() sys.exit(app.exec_()) if __name__ == '__main__': main()