我有一个简短的脚本,可以使用 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()
有什么办法让它正确显示每个阶段吗?
如果没有循环代码和工作示例,很难确定您的问题。但我有类似的测试应用程序,希望它会有所帮助。
#!/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()
.
缩放像素图只是为了显示它的大小和居中是昂贵的,QGraphicsView.fitInView()
为此目的而制作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)