Klar, logisch, daran hätte ich denken müssen.
Qt verwaltet Referenzen normalerweise in einem Objektbaum, so dass man sich nicht selbst darum kümmern muss. In deinem Code aber setzt du die Vater-Kind-Beziehungen nicht richtig. Beim View macht das nichts aus, weil QMainWindow beim Aufruf von .setCentralWidget() automatisch die Vaterschaft des View-Widgets übernimmt und somit eine Referenz hält.
Der View aber übernimmt die Vaterschaft zugewiesener Models nicht automatisch, da ein Model gleichzeitig mehrere Views haben kann. Daher musst du dem Model selbstständig ein Vaterobjekt zuweisen, in dem du den Code wie folgt änderst.
TimeTable.__init__():
Code: Alles auswählen
def __init__(self, filename, parent=None):
QtCore.QAbstractTableModel.__init__(self, parent)
# restlicher code
Btw, wenn du von QAbstractTableModel ableitest, solltest du auch dessen Konstruktor aufrufen
Erzeugung des Models und des views:
Code: Alles auswählen
view = QTableView(self)
model = TimeTable(filename, view)
view.setModel(model)
self.setCentralWidget(view)
Dann funktioniert das Fenster auch ohne das Setzen eines Instanzattributs.
Memo für die Zukunft: Den Parameter "parent" im Konstruktor der ganzen Qt-Klassen sollte man auch nutzen
