首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setPixmap导致使用退出代码1完成的过程

setPixmap导致使用退出代码1完成的过程
EN

Stack Overflow用户
提问于 2020-01-31 15:03:31
回答 1查看 433关注 0票数 0

我从函数(find_defects)返回一个图像。我看到这是一个有效的图像。

在使用return之前,我使用cv2.imshow检查图像,这也和我预期的一样。但是,当我试图在我用PyQt设计的GUI上显示这个图像时,我看到了这个错误:

代码语言:javascript
复制
Process finished with exit code 1

编辑:最小可复制示例:

代码语言:javascript
复制
from PyQt5.QtCore import *
import cv2
from PyQt5.QtWidgets import QLabel, QWidget, QPushButton, QVBoxLayout, QApplication
from PyQt5.QtGui import QPixmap, QImage


class first_GUI(QWidget):
    def __init__(self):
        # super(first_GUI, self).__init__()
        # super().__init__()
        QWidget.__init__(self)
        self.frame_defects = cv2.imread('output.jpg')
        self.label_text = QLabel("Hi")
        self.label_text.setAlignment(Qt.AlignCenter)
        self.label_text.setStyleSheet("color: rgb(0,0,255);font-weight: bold; font-size: 16pt")
        pushButton_show = QPushButton("Show")
        pushButton_show.setMinimumHeight(40)
        pushButton_show.setStyleSheet("font-weight: bold; font-size: 16pt")
        pushButton_show.clicked.connect(self.show_image)
        vertical_layout = QVBoxLayout()
        vertical_layout.addWidget(self.label_text)
        vertical_layout.addWidget(pushButton_show)
        self.setLayout(vertical_layout)
        self.setWindowTitle("PyQt5 first GUI")
        self.resize(400, 300)


    def show_image(self):

        if self.frame_defects is not None:
            image = QImage(self.frame_defects, self.frame_defects.shape[1], self.frame_defects.shape[0],
                           QImage.Format_RGB888)  # The image is stored using a 24-bit RGB format (8-8-8).
            self.pixmap2 = QPixmap.fromImage(image)
        self.label.setPixmap(self.pixmap2)

app = QApplication([])
widget = first_GUI()
widget.show()
app.exec_()  

图片:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-31 16:49:11

考虑使用QGraphicsView而不是标签。

代码语言:javascript
复制
# Create scene
self.image_item = QGraphicsPixmapItem()
scene = QGraphicsScene(self)
scene.addItem(self.image_item)

# Create GraphicView display
self.view = QGraphicsView(scene, self)
image = QImage(self.frame_defects, self.frame_defects.shape[1], self.frame_defects.shape[0], self.frame_defects.shape[1]*3, QImage.Format_RGB888)
self.image_item.setPixmap(QPixmap.fromImage(image))
self.view.fitInView(self.image_item)

还请注意,self.frame_defects的dtype是‘uint8 8’,如果您不在QImage构造函数中指定bytesperline参数,它将被转换为'uint32‘或’it 32‘。因此,为了保持图像每行的字节数,我使用了一个不同的QImage构造函数:

代码语言:javascript
复制
QImage(self.frame_defects, self.frame_defects.shape[1], self.frame_defects.shape[0], self.frame_defects.shape[1]*3, QImage.Format_RGB888)

编辑:我在我的PyCharm中尝试了这段代码,它起作用了:

代码语言:javascript
复制
from PyQt5.QtCore import *
import cv2
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *


class first_GUI(QWidget):
    def __init__(self):
        # super(first_GUI, self).__init__()
        # super().__init__()
        QWidget.__init__(self)
        self.frame_defects = cv2.imread('output.jpg')
        self.image_item = QGraphicsPixmapItem()
        scene = QGraphicsScene(self)
        scene.addItem(self.image_item)
        self.view = QGraphicsView(scene, self)

        pushButton_show = QPushButton("Show")
        pushButton_show.setMinimumHeight(40)
        pushButton_show.setStyleSheet("font-weight: bold; font-size: 16pt")
        pushButton_show.clicked.connect(self.show_image)

        vertical_layout = QVBoxLayout()
        vertical_layout.addWidget(self.view)
        vertical_layout.addWidget(pushButton_show)

        self.setLayout(vertical_layout)
        self.setWindowTitle("PyQt5 first GUI")
        self.resize(400, 300)

    def show_image(self):
        image = QImage(self.frame_defects, self.frame_defects.shape[1], self.frame_defects.shape[0], self.frame_defects.shape[1]*3, QImage.Format_RGB888)
        self.image_item.setPixmap(QPixmap.fromImage(image))
        self.view.fitInView(self.image_item)


app = QApplication([])
widget = first_GUI()
widget.show()
app.exec_()

edit2:

在image.rgbSwapped构造函数之后添加QImage =QImage():

代码语言:javascript
复制
    def show_image(self):
    image = QImage(self.frame_defects, self.frame_defects.shape[1], self.frame_defects.shape[0], self.frame_defects.shape[1]*3, QImage.Format_RGB888)
    image = image.rgbSwapped()
    self.image_item.setPixmap(QPixmap.fromImage(image))
    self.view.fitInView(self.image_item)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60006400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档