PyQt5 Signal and Slot не будет срабатывать и зависает Python - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть пользовательский интерфейс, который я встроил в QDesigner, и когда я пытаюсь соединить сигнал и слот, Python выдает следующую ошибку:

TypeError: ошибка connect () между clicked (bool) и loadClicked ()

Если я удаляю конструктор @pyqtSlot (), пользовательский интерфейс запускается, но когда я нажимаю кнопку, Python выдает ошибку и завершает работу. Что может быть причиной проблемы?

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import pyqtSlot
import cv2
import sys

class Ui_Dialog(object):
    def setupUi(self, Dialog):
    # Other UI Setup and config attributes
    self.SelectImage.clicked.connect(self.loadClicked)

@pyqtSlot()
def loadClicked(self):
    super(self.loadImage("Wilkerson.png"))

def loadImage(self, fname):
    self.image = cv2.imread(fname)
    self.displayImage()

def displayImage(self):
    qformat=QImage.Format_Indexed8
    if len(self.image.shape) == 3:
        if (self.image.shape[2]) == 4:
            qformat = QImage.Format_RGBA8888
        else:
            qformat = QImage.Format_RGB888
    img = QImage(self.image, self.image.shape[1], self.image.shape[0], self.image.strides[0], qformat)
    img = img.rgbSwapped()
    self.importedImageFrame.setPixmap(QPixmap.fromImage(img))
    self.importedImageFrame.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)

Я избавился от кода пользовательского интерфейса QDesigner и попытался просто импортировать файл пользовательского интерфейса. Это все еще не решило проблему. Пересмотренный код ниже.

class ezNPR(QDialog):
def __init__(self):
    super(ezNPR,self).__init__()
    loadUi('ezNPRApp.ui',self)
    self.Image=None
    # Insert Application control commands here
    self.AppStackedWidget.setCurrentIndex(0)
    self.ExitPushButton.clicked.connect(QDialog.close)
    self.ImagePushButton.clicked.connect(lambda:self.AppStackedWidget.setCurrentIndex(0))
    self.SignaturePushButton.clicked.connect(lambda:self.AppStackedWidget.setCurrentIndex(1))
    self.HelpPushButton.clicked.connect(lambda:self.AppStackedWidget.setCurrentIndex(2))
    self.SelectImage.clicked.connect(self.loadClicked)
    self.setWindowTitle("ezNPR Image and Photo Cropping Tool")

@pyqtSlot()
def loadClicked(self):
    fname, filter = QFileDialog.getOpenFileName(self, "Open File", 'C:\\', "Image Files (*.jpg,*.png,*.bmp,*.tif)")
    if fname:
        self.loadImage(fname)
    else:
        msg = QtWidgets.QMessageBox()
        msg.setText("Invalid image type selected. Please select a new image.")
        msg.setInformativeText("You must selct a BMP, JPG, PNG, or TIFF")
        msg.setWindowTitle("Error Loading Image")
        msg.setStandardButtons(msg.Ok)

def loadImage(self, fname):
    self.displayImage()
    self.image = cv2.imread(fname)

def displayImage(self):
    qformat = QImage.Format_Indexed8
    if len(self.image.shape) == 3:
        if (self.image.shape[2]) == 4:
            qformat = QImage.Format_RGBA8888
        else:
            qformat = QImage.Format_RGB888
    img = QImage(self.image, self.image.shape[1], self.image.shape[0], self.image.strides[0], qformat)
    img = img.rgbSwapped()
    self.importedImageFrame.setPixmap(QPixmap.fromImage(img))
    self.importedImageFrame.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)

Я вернулся и пересмотрел несколько вещей и смог решить проблему. Однако теперь я столкнулся с новой проблемой, заключающейся в невозможности привести выходное изображение в соответствие с меткой QDsigner, которую я создал для отображения изображения. Предварительно преобразованное изображение отображается, но оно не масштабируется по размеру этикетки. Мой код висит со второй до последней строки в функции display_image ...

import sys, traceback
import os
import cv2
from PyQt5 import QtCore
from PyQt5.QtCore import *
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtWidgets import QDialog, QFileDialog, QApplication, QComboBox, QStackedWidget
from PyQt5.uic import loadUi

class ezNPR(QDialog):
    def __init__(self):
        super(ezNPR, self).__init__()
        loadUi('ezNPRApp.ui', self)
    self.image = None
    self.AppStackedWidget.setCurrentIndex(0)
    self.ExitPushButton.clicked.connect(QDialog.close)
    self.ImagePushButton.clicked.connect(lambda: self.AppStackedWidget.setCurrentIndex(0))
    self.SignaturePushButton.clicked.connect(lambda: self.AppStackedWidget.setCurrentIndex(1))
    self.HelpPushButton.clicked.connect(lambda: self.AppStackedWidget.setCurrentIndex(2))
    self.SelectImage.clicked.connect(self.load_clicked)

@pyqtSlot()
def load_clicked(self):
    fname, filter = QFileDialog.getOpenFileName(self, "Open File", os.getenv("HOME"))
    try:
        if fname:
            self.image = cv2.imread(fname)
            #cv2.imshow("First Image", self.image)
            self.display_image()
        else:
            print('No image selected')
            # msg = QtWidgets.QMessageBox()
            # msg.setText("Invalid image type selected. Please select a new image.")
            # msg.setInformativeText("You must select a BMP, JPG, PNG, or TIFF")
            # msg.setWindowTitle("Error Loading Image")
            # msg.setStandardButtons(msg.Ok)
    finally:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        print("*** print_tb:")
        traceback.print_tb(exc_traceback, limit=5, file=sys.stdout)

def display_image(self):
    displayorig = self.image
    dih, diw = displayorig.shape[:2]
    if dih > diw:
        resizedisplayorig = cv2.resize(displayorig, None, fx=0.2, fy=0.5, interpolation=cv2.INTER_LINEAR)
    else:
        resizedisplayorig = cv2.resize(displayorig, None, fx=0.5, fy=0.2, interpolation=cv2.INTER_LINEAR)
    resizedisplayorig = cv2.cvtColor(resizedisplayorig, cv2.COLOR_BGR2RGB)
    rdih, rdiw = resizedisplayorig.shape[:2]
    #cv2.imshow("Final Image", resizedisplayorig)
    self.importedImageFrame.setPixmap(QPixmap.fromImage(resizedisplayorig))     #Hangs here
    self.importedImageFrame.setAlignment(QtCore.Qt.AlignHCenter |      QtCore.Qt.AlignVCenter)
    self.inputImageLabel.setText(rdih + " X " + rdiw)

if __name__ == "__main__":
    app=QApplication(sys.argv)
    window=ezNPR()
    window.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...