在QGraphicsScene中显示图像
我有一个小脚本,它使用PIL多次修改一张图片。我想在每次修改完成后都能显示出中间的步骤,所以我添加了一个QGraphics场景,想在里面展示这些步骤。最终的步骤(在退出函数前最后一个显示的)能够正确地调整大小并居中显示,但中间的步骤却没有调整大小或居中。
用来显示图片的代码是:
#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()
有没有什么办法让每个步骤都能正确显示呢?
1 个回答
9
没有看到你的循环代码和具体例子,很难确定你的问题。不过我有一个类似的测试应用,希望能对你有帮助。
#!/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.ImageQt
的引用(self.imgQ
),否则程序会崩溃。根据我的理解,你在每次循环中都在创建
QGraphicsScene
,其实最好只创建一次,然后调用scene.clear()
来清空。为了显示图像并让它居中缩放,直接缩放pixmap是比较耗资源的,使用
QGraphicsView.fitInView()
来实现这个功能更合适。