2012-01-07 218 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