2012-01-07 14 views
4

PILで画像を何度か変更する短いスクリプトがあります。 QGraphicsのシーンを追加してステージを表示しようとしていますので、中間ステップを表示することができるようにしたいと思います。最終段階(機能を終了する前に最後に掲示された最後の段階)のサイズと中心を適切に調整しますが、サイジングやセンタリングを行わずに中間段階を表示します。QGraphicsSceneの画像を表示する

画像を投稿するコードは次のとおりです。

 #Code to generate the image and create the loop here... 
     imgQ = ImageQt.ImageQt(img) 
     pixMap = QtGui.QPixmap.fromImage(imgQ) 

     scene = QtGui.QGraphicsScene() 
     self.ui.previewGv.setScene(scene) 
     pixMap = pixMap.scaled(self.ui.previewGv.size()) 
     #scene.clear() 
     scene.addPixmap(pixMap)    
     self.ui.previewGv.repaint() 
     self.ui.previewGv.show() 

は、それが適切に各段階を表示するために取得するためのいくつかの方法はありますか?

答えて

8

ループコードと実際の例がないと、問題を特定することは困難です。しかし、私は同様のテストアプリケーションを持って、それが助けてくれることを望みます。

#!/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.ImageQtself.imgQ)への参照を保存しています。クラッシュする場合があります。

  • 私が理解したように、各反復ではQGraphicsSceneを作成しています。それを一度作成してからscene.clear()に電話する方がよいでしょう。

  • サイズを変更して中央に表示するだけのスケーリングは、この目的ではQGraphicsView.fitInView()となります。

+0

これは完全に機能します。ありがとうございます。 – TimothyAWiseman