import sys from PySide2 import QtCore, QtWidgets from PySide2.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(QtWidgets.QTableView): def __del__(self): print("Deleted {0}".format(self.__class__)) def closeEvent(self, event): self.setParent(None) gc.collect() class MainWidget(QtWidgets.QWidget): def __init__(self, parent = None): super().__init__(parent) self.setLayout(QtWidgets.QHBoxLayout()) self.pop_tree = QtWidgets.QPushButton("Pop") self.pop_tree.clicked.connect(self.onPop) self.layout().addWidget(self.pop_tree) def onPop(self): tableView = TableView(self) model = TableModel(tableView) tableView.setModel(model) tableView.setWindowFlags(QtCore.Qt.Window) tableView.show() def main(): app = QtWidgets.QApplication(sys.argv) widget = MainWidget() widget.show() sys.exit(app.exec_()) if __name__ == '__main__': main()