2013-11-10 1 views
1

следующий пример кода происходит сбой с этой ошибкой, когда я закрыть приложение:Ошибка вида модели РЕАЛИЗАЦИЯ графического интерфейса в PyQt

QBasicTimer::start: QBasicTimer can only be used with threads started with QThread 

Вот мой код:

import sys 
from PyQt4 import QtGui ,QtCore 

app = QtGui.QApplication(sys.argv) 

data=[] 
data.append("one") 
model=QtGui.QStringListModel(data) 

combobox=QtGui.QComboBox() 
combobox.show() 
combobox.setModel(model) 

sys.exit(app.exec_()) 

я узнал, что это об использовании модели, но я не знаю, как ее исправить.

отредактирован: ОС: Win 7 64bit PyQt4

+0

Невозможно воспроизвести, пожалуйста, предоставьте информацию о версиях Python, Qt и PyQt вместе с ОС. –

ответ

3

Программа не «сбой»: это просто печать сообщение об ошибке во время нормального процесса завершения работы.

Причина, по которой отображается сообщение, является побочным эффектом сбора мусора. Когда 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_())