2012-01-07 86 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,你需要調用QCoreApplication.processEvents()允許的Qt做更新。

  • 我正在保存對ImageQt.ImageQtself.imgQ)的引用,否則它會崩潰。

  • 據我所知,你在每次迭代中創建QGraphicsScene,創建一次的更好的解決方案,然後調用scene.clear()

  • 縮放pixmap只是爲了顯示它的大小和居中價格昂貴,QGraphicsView.fitInView()爲此目的。

+0

這很好,謝謝。 – TimothyAWiseman 2012-03-20 20:17:17