ループコードと実際の例がないと、問題を特定することは困難です。しかし、私は同様のテストアプリケーションを持って、それが助けてくれることを望みます。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import Image
import ImageQt
import ImageEnhance
import time
class TestWidget(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.scene = QGraphicsScene()
self.view = QGraphicsView(self.scene)
self.button = QPushButton("Do test")
layout = QVBoxLayout()
layout.addWidget(self.button)
layout.addWidget(self.view)
self.setLayout(layout)
self.button.clicked.connect(self.do_test)
def do_test(self):
img = Image.open('image.png')
enhancer = ImageEnhance.Brightness(img)
for i in range(1, 8):
img = enhancer.enhance(i)
self.display_image(img)
QCoreApplication.processEvents() # let Qt do his work
time.sleep(0.5)
def display_image(self, img):
self.scene.clear()
w, h = img.size
self.imgQ = ImageQt.ImageQt(img) # we need to hold reference to imgQ, or it will crash
pixMap = QPixmap.fromImage(self.imgQ)
self.scene.addPixmap(pixMap)
self.view.fitInView(QRectF(0, 0, w, h), Qt.KeepAspectRatio)
self.scene.update()
if __name__ == "__main__":
app = QApplication(sys.argv)
widget = TestWidget()
widget.resize(640, 480)
widget.show()
sys.exit(app.exec_())
主なポイント:
あなたがループ内で何らかの処理またはsleep
を行っている場合、あなたはQtは更新を行うことができるようにQCoreApplication.processEvents()
を呼び出す必要があります。
ImageQt.ImageQt
(self.imgQ
)への参照を保存しています。クラッシュする場合があります。
私が理解したように、各反復ではQGraphicsScene
を作成しています。それを一度作成してからscene.clear()
に電話する方がよいでしょう。
サイズを変更して中央に表示するだけのスケーリングは、この目的ではQGraphicsView.fitInView()
となります。
これは完全に機能します。ありがとうございます。 – TimothyAWiseman