У меня есть пользовательский интерфейс, который я встроил в 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_())