私はpythonとQtの両方が大好きですが、Qtがpythonを念頭に置いて設計されていないことは明らかです。PyQt/をクラッシュさせる方法はたくさんあります。 PySideアプリケーション。適切なツールを使用しても、その多くはデバッグが非常に困難です。
知りたいのですが、PyQtとPySideを使用するときにクラッシュやロックアップを回避するためのグッドプラクティスは何ですか?これらは、一般的なプログラミングのヒントやサポートモジュールから、回避すべき非常に具体的な回避策やバグまで、何でもかまいません。
Qtがオブジェクトを自動削除する状況に注意してください。 pythonラッパーにC++オブジェクトが削除されたことが通知されていない場合、それにアクセスするとクラッシュが発生します。これは、PyQtとPySideがQtを追跡するのが難しいため、さまざまな方法で発生する可能性があります。オブジェクト。
QTreeWidgetからアイテムを削除すると、関連するウィジェット(QTreeWidget.setItemWidgetで設定)がすべて削除されます。
# Example:
from PyQt4 import QtGui, QtCore
app = QtGui.QApplication([])
# Create a QScrollArea, get a reference to one of its scroll bars.
w = QtGui.QWidget()
sa = QtGui.QScrollArea(w)
sb = sa.horizontalScrollBar()
# Later on, we delete the top-level widget because it was removed from the
# GUI and is no longer needed
del w
# At this point, Qt has automatically deleted all three widgets.
# PyQt knows that the QScrollArea is gone and will raise an exception if
# you try to access it:
sa.parent()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: underlying C/C++ object has been deleted
# However, PyQt does not know that the scroll bar has also been deleted.
# Since any attempt to access the deleted object will probably cause a
# crash, this object is 'toxic'; remove all references to it to avoid
# any accidents
sb.parent()
# Segmentation fault (core dumped)
参考までに、 PyQtの作者からのコメント をルークの回答に投稿します:「それはゴミだ」。
誰かがこの投稿に飛び込んで、これらすべての(存在しない)「問題」に戸惑い続ける可能性があるので、それは重要だと思います。
要点を追加するだけです:
Qtベースのプログラムでスレッドを使用する必要がある場合は、自動ガベージコレクターを無効にし、メインスレッドで手動収集を行う必要があります( http://pydev.blogspot.com.br/2014/で説明されているように) 03/should-python-garbage-collector-be.html )-オブジェクトにサイクルがないことを確認した場合でも、これを行う必要があることに注意してください(サイクルでは、基本的にオブジェクトを=までライブにしますpythonサイクリックガベージコレクターが発生しますが、例外として何かがある場合、フレームが存続する可能性があるため、そのような状況では、オブジェクトが予想よりも長く存続する可能性があります)...そのような場合、ガベージコレクターがセカンダリスレッドにぶつかり、qtがsegfaultする可能性があります(qtウィジェットは常にメインスレッドで収集する必要があります)。