Программа не «сбой»: это просто печать сообщение об ошибке во время нормального процесса завершения работы.
Причина, по которой отображается сообщение, является побочным эффектом сбора мусора. Когда python отключается, порядок, в котором объекты удаляются, может быть непредсказуемым. Это может привести к тому, что объекты на стороне C++ будут удалены в «неправильном» порядке, и поэтому Qt иногда будет жаловаться, когда это произойдет.
Одним из способов «исправления» кода примера было бы просто переименовать некоторые из объектов PyQt. Например, если я меняю имя combobox
на combo
, сообщение об ошибке исчезнет. В этом нет ничего загадочного - это просто изменяет порядок удаления объектов.
Но другой, гораздо более надежный способ устранения проблемы состоит в том, чтобы убедиться, что у QStringListModel
есть родительский элемент, так как возможно, что Qt не получает права собственности на него, когда он передан в поле со списком. Qt всегда должен правильно обрабатывать удаление дочерних объектов, когда они связаны друг с другом таким образом. Таким образом, пример кода станет следующим:
import sys
from PyQt4 import QtGui, QtCore
app = QtGui.QApplication(sys.argv)
combobox = QtGui.QComboBox()
data = []
data.append("one")
model = QtGui.QStringListModel(data, combobox)
combobox.setModel(model)
combobox.show()
sys.exit(app.exec_())
Невозможно воспроизвести, пожалуйста, предоставьте информацию о версиях Python, Qt и PyQt вместе с ОС. –