Ответ 1
Это, вероятно, не ошибка PyQt, а неправильное поведение кода.
Когда python проходит процесс завершения, порядок, в котором объекты удаляются, может быть непредсказуемым. Иногда это может привести к появлению нескольких непонятных сообщений об ошибках.
Ваш script отлично работает на моей (не-Ubuntu) Linux-машине - но когда я закрываю окно, я получаю этот вывод:
$ python2 test.py
QPixmap: Must construct a QApplication before a QPaintDevice
Aborted
Что, взятое по номиналу, кажется, не имеет никакого смысла...
Однако обычно легко избавиться от таких сообщений об ошибках, заставляя объекты удаляться в другом порядке.
Один (немного странный) способ сделать это - просто переименовать некоторые из объектов. Поэтому для меня сообщения об ошибках исчезают, если я просто изменяю view
на _view
.
Однако, возможно, лучшей альтернативой является убедиться, что определенные ключевые объекты соединены вместе в иерархии parent/child:
view = QGraphicsView()
scene = QGraphicsScene(view)
Причиной этого является то, что при удалении объекта Qt автоматически удаляет все его потоки QObject
. Это может помочь убедиться, что сторона С++ на PyQt очищена до стороны python (что действительно является причиной того, что вызывает эти проблемы).
Другая возможность - сохранить глобальную ссылку на QApplication
и поместить все остальное в функцию main
:
import sys
from PyQt4.QtGui import *
def main():
view = QGraphicsView()
scene = QGraphicsScene()
scene.addText("Hello!")
view.setScene(scene)
view.show()
return qApp.exec_()
if __name__ == '__main__':
app = QApplication(sys.argv)
sys.exit(main())