いくつかの実験中に収集されたデータの視覚的分析を実行するために、PyQt を使用して GUI を開発しています。GUI は、分析するデータが配置されているディレクトリを指定するようにユーザーに求めます。
class ExperimentAnalyzer(QtGui.QMainWindow):
## other stuff here
def loadExperiment(self):
directory = QtGui.QFileDialog.getExistingDirectory(self,
"Select Directory")
## load data from directory here
GUI は再生機能を提供します。これにより、ユーザーは実験データが時間の経過とともにどのように変化するかを確認できます。これはQTimerを通して実装されます:
def playOrPause(self):
## play
if self.appStatus.timer is None:
self.appStatus.timer = QtCore.QTimer(self)
self.appStatus.timer.connect(self.appStatus.timer,
QtCore.SIGNAL("timeout()"),
self.nextFrame)
self.appStatus.timer.start(40)
## pause
else:
self.appStatus.timer.stop()
self.appStatus.timer = None
データの時系列を再生してから一時停止し、ディレクトリを変更して新しい実験からデータをロードしようとすると、セグメンテーション エラーが発生します。
いくつかのデバッグ プリントを使用して、呼び出すとアプリケーションがクラッシュすることがわかりました。
QtGui.QFileDialog.getExistingDirectory(self, "Select Directory")
loadExperimentメソッドで。
私は Qt にかなり慣れていないので、タイマーを適切に処理していないと思います。
Ubuntu 10.04でPyQt 4.9、Python 2.7.3を使用しています。
編集-1 :
ルークの答えの後、私は自分のコードに戻りました。
次に示すのは、タイマーがタイムアウトシグナルを発するたびに呼び出されるnextFrameメソッドです。GUI に含まれる QGraphicsScene 要素を更新します。
def nextFrame(self):
image = Image.open("<some jpg>")
w, h = image.size
imageQt = ImageQt.ImageQt(image)
pixMap = QtGui.QPixmap.fromImage(imageQt)
self.scene.clear()
self.scene.addPixmap(pixMap)
self.view.fitInView(QtCore.QRectF(0, 0, w, h),
QtCore.Qt.KeepAspectRatio)
ここで、self.scene および self.view オブジェクトは、GUI コンストラクターで以前にインスタンス化されています。
self.view = QtGui.QGraphicsView(self)
self.scene = QtGui.QGraphicsScene()
self.view.setScene(self.scene)
この行にコメントすることがわかりました:
# self.scene.addPixmap(pixMap)
上記で報告された同じ操作シーケンスを繰り返すと、セグメンテーション違反はもう発生しません。
編集-2 :
アプリケーションを gdb (python-dbg) で実行すると、QPainter::drawPixmap の呼び出し後にセグメンテーション違反が発生することがわかりました。
(gdb) bt
#0 0xb6861f1d in ?? () from /usr/lib/i386-linux-gnu/libQtGui.so.4
#1 0xb685d491 in ?? () from /usr/lib/i386-linux-gnu/libQtGui.so.4
#2 0xb693bcd3 in ?? () from /usr/lib/i386-linux-gnu/libQtGui.so.4
#3 0xb69390bc in ?? () from /usr/lib/i386-linux-gnu/libQtGui.so.4
#4 0xb6945c77 in ?? () from /usr/lib/i386-linux-gnu/libQtGui.so.4
#5 0xb68bd424 in QPainter::drawPixmap(QPointF const&, QPixmap const&) () from /usr/lib/i386-linux-gnu/libQtGui.so.4
したがって、私が最初に信じていたように、タイマーの処理に関連する問題ではありません。
pixMap で何か間違ったことをしているため、セグメンテーション違反が発生します。