如何在每个 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 中显示两个图像的主要内容,如果未能解决你的问题,请参考以下文章