【问题标题】:Displayin an Image in a QGraphicsScene在 QGraphicsScene 中显示图像
【发布时间】:2012-01-07 01:32:44
【问题描述】:

我有一个简短的脚本,可以用 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()

有没有办法让它正确显示每个阶段?

【问题讨论】:

    标签: python pyqt pyqt4


    【解决方案1】:

    如果没有循环代码和工作示例,很难确定您的问题。但我有类似的测试应用程序,希望它会有所帮助。

    #!/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() 就是为此目的而制作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      相关资源
      最近更新 更多