如何在每个 Qlabel PyQt5 中显示两个图像

Posted

技术标签:

【中文标题】如何在每个 Qlabel PyQt5 中显示两个图像【英文标题】:How to display two images in each Qlabel PyQt5 【发布时间】:2020-08-10 05:56:32 【问题描述】:

您好,我是 PyQt5 的初学者,我的小项目正在使用 PyQt5 Designer 创建图像预测器 GUI,以通过单击 PREDICT 按钮来检测图像是否是猫。我可以通过浏览文件按钮浏览我想要预测的文件。问题是每当我选择通过浏览文件按钮添加的猫图像并单击 PREDICT 按钮时,与 PREDICT 按钮关联的图像不会出现。

关于 Qlabel 的文档没有为我提供足够清晰的信息来解决这个问题。

这是我的代码:

from PyQt5 import QtCore, QtGui, QtWidgets
import os

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
    MainWindow.setObjectName("MainWindow")
    MainWindow.resize(1600, 900)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")

    self.photo = QtWidgets.QLabel(self.centralwidget)
    self.photo.setGeometry(QtCore.QRect(10, 20, 761, 651))
    font = QtGui.QFont()
    font.setPointSize(40)
    self.photo.setFont(font)
    self.photo.setFrameShape(QtWidgets.QFrame.Panel)
    self.photo.setFrameShadow(QtWidgets.QFrame.Sunken)
    self.photo.setLineWidth(5)
    self.photo.setMidLineWidth(0)
    self.photo.setScaledContents(True)
    self.photo.setObjectName("photo")

    self.browseFile = QtWidgets.QPushButton(self.centralwidget)
    self.browseFile.setGeometry(QtCore.QRect(350, 700, 151, 31))
    font = QtGui.QFont()
    font.setPointSize(10)
    self.browseFile.setFont(font)
    self.browseFile.setObjectName("browseFile")
    self.browseFile.clicked.connect(self.browse_file)

    self.predict = QtWidgets.QPushButton(self.centralwidget)
    self.predict.setGeometry(QtCore.QRect(670, 750, 231, 61))
    font = QtGui.QFont()
    font.setPointSize(17)
    font.setBold(False)
    font.setWeight(50)
    self.predict.setFont(font)
    self.predict.setObjectName("predict")
    self.predict.clicked.connect(self.show_predict)

    self.photo2 = QtWidgets.QLabel(self.centralwidget)
    self.photo2.setGeometry(QtCore.QRect(790, 20, 791, 651))
    font = QtGui.QFont()
    font.setPointSize(40)
    self.photo2.setFont(font)
    self.photo2.setFrameShape(QtWidgets.QFrame.Panel)
    self.photo2.setFrameShadow(QtWidgets.QFrame.Sunken)
    self.photo2.setLineWidth(5)
    self.photo2.setScaledContents(True)
    self.photo2.setObjectName("photo2")

    self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
    self.lineEdit.setGeometry(QtCore.QRect(520, 700, 521, 31))
    self.lineEdit.setObjectName("lineEdit")
    MainWindow.setCentralWidget(self.centralwidget)

    self.menubar = QtWidgets.QMenuBar(MainWindow)
    self.menubar.setGeometry(QtCore.QRect(0, 0, 1600, 25))
    self.menubar.setObjectName("menubar")
    MainWindow.setMenuBar(self.menubar)

    self.statusbar = QtWidgets.QStatusBar(MainWindow)
    self.statusbar.setObjectName("statusbar")
    MainWindow.setStatusBar(self.statusbar)

    self.retranslateUi(MainWindow)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
    _translate = QtCore.QCoreApplication.translate
    MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    self.photo.setText(_translate("MainWindow", "INPUT"))
    self.browseFile.setText(_translate("MainWindow", "Browse file"))
    self.predict.setText(_translate("MainWindow", "PREDICT"))
    self.photo2.setText(_translate("MainWindow", "OUTPUT"))

def browse_file(self):
    directory = QtWidgets.QFileDialog.getOpenFileName(None, "Browse File", "", "PNG (*.PNG *.png")[0]
    print(directory)
    pixmap =  QtGui.QPixmap(directory)
    self.photo.setPixmap(pixmap.scaled(self.photo.size()))
    self.lineEdit.setText(''.format(directory))

def _set_text(self, text):
    return text

def show_predict(self):
    self.photo2.setPixmap(QtGui.QPixmap(os.path.realpath("image/predictions.png")))  

if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())

【问题讨论】:

我必须承认我从不关心QtCore.QMetaObject.connectSlotsByName()。但是,猜测它的作用,请注意self.predict.setObjectName("predict")def show_predict(self):。也许,如果您在信号槽中添加了(临时)调试控制台输出,您可以自己找到它 - 看看它是否被调用。 @Scheff 谢谢你的回复。实际上def show_predict(self): 是我定位和显示我的预测图像的功能,另一个只是给对象一个名称。如果我只使用一个 Qlabel 来显示我的图像,它工作正常,但如果我在 MainWindow 放置两个 Qlabel,它就不行了。 欢迎 sswwann,你调试过代码找到它停止工作的地方了吗? 我刚刚发现您将信号处理程序显式连接到 self.predict.clicked.connect(self.show_predict)。 (所以,我对QtCore.QMetaObject.connectSlotsByName() 的怀疑是不管的。)您可以检查self.photo2.setPixmap(QtGui.QPixmap(os.path.realpath("image/predictions.png"))) 是否会失败。你确定image/predictions.png可以正常解决吗?也许,尝试使用绝对路径进行调试。 @Scheff 是的,我已经在使用信号处理程序来运行 show_predict 。原来这是一个路径问题,我的错。感谢您指出。 【参考方案1】:

我的错误,通过使用绝对路径而不是目录内路径来解决。

【讨论】:

以上是关于如何在每个 Qlabel PyQt5 中显示两个图像的主要内容,如果未能解决你的问题,请参考以下文章

改变QLabel的大小时,PyQt5“定时器无法从另一个线程启动”错误

如何在 PyQt5 中将字节数组图像添加到 QLabel

PyQt5 控件学习(一个一个学习之QLabel)

PyQt5 修复 Qlabel 位置

Pyqt5:使用Qlabel标签进行视频播放

如何在 PyQt5 中正确显示图片? [关闭]