python - PyQt5 - 为每个按钮点击打开新的图像窗口
问题描述
我一直在玩 PyQt5 并被困在这里。在某个菜单中,对于每个按钮单击(和给定的 numpy 图像数组),我正在尝试打开一个新的图像窗口(同时将 numpy 数组转换为图像)。
所以首先,我为一个图像做了(使用这个答案将 numpy 图像数组转换为 QPixmap):
NewNumpyImageWindow.py类:
import cv2
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
from PyQt5.QtGui import QPixmap, QImage
class NewImage(QWidget):
def __init__(self, npImage):
super().__init__()
label = QLabel(self)
pixmap = self.ConvertNumpyToQPixmap(npImage)
label.setPixmap(pixmap)
self.resize(pixmap.width(), pixmap.height())
self.show()
@staticmethod
def ConvertNumpyToQPixmap(np_img):
height, width, channel = np_img.shape
bytesPerLine = 3 * width
return QPixmap(QImage(np_img.data, width, height, bytesPerLine, QImage.Format_RGB888).rgbSwapped())
if __name__ == '__main__':
app = QApplication(sys.argv)
currentNumpyImage = cv2.imread("capture.png")
window = NewImage(currentNumpyImage)
sys.exit(app.exec_())
它工作正常。图像显示为一个新窗口。现在,我希望每次按下主菜单中的按钮时图像都显示为一个新窗口。
因此,我尝试为每次按下(在按钮“新建”上)创建上述类的实例,但它不起作用。该窗口似乎显示为一个新窗口,并在代码完成后立即关闭。
NewNumpyImageWindowMenu.py类:
import cv2
import sys
from PyQt5 import QtWidgets
from NewNumpyImageWindow import NewImage
class Menu(QtWidgets.QMainWindow):
def __init__(self, numpyPic):
super().__init__()
newAct = QtWidgets.QAction('New', self)
self.numpyPicture = numpyPic
newAct.triggered.connect(self.newPicture)
toolbar = self.addToolBar('Exit')
toolbar.addAction(newAct)
self.setGeometry(300, 300, 350, 250)
self.show()
def newPicture(self):
NewImage(self.numpyPicture) #From the previous class
if __name__ == '__main__':
currentNumpyImage = cv2.imread("capture.png")
app = QtWidgets.QApplication(sys.argv)
ex = Menu(currentNumpyImage)
sys.exit(app.exec_())
任何帮助,将不胜感激。谢谢。
解决方案
试试看:
NewNumpyImageWindowMenu.py
import cv2
import sys
from PyQt5 import QtWidgets
from NewNumpyImageWindow import NewImage
class Menu(QtWidgets.QMainWindow):
def __init__(self, numpyPic):
super().__init__()
newAct = QtWidgets.QAction('New', self)
self.numpyPicture = numpyPic
newAct.triggered.connect(self.newPicture)
toolbar = self.addToolBar('Exit')
toolbar.addAction(newAct)
self.setGeometry(300, 300, 350, 250)
self.show()
def newPicture(self):
#NewImage(self.numpyPicture) #From the previous class # ---
self.newImage = NewImage(self.numpyPicture) # +++
if __name__ == '__main__':
#currentNumpyImage = cv2.imread("capture.png")
currentNumpyImage = cv2.imread("logo.png")
app = QtWidgets.QApplication(sys.argv)
ex = Menu(currentNumpyImage)
sys.exit(app.exec_())
推荐阅读
- java - 带有嵌套字段的 Spring 数据查询(加入其他列)
- mysql - SQL 组结果为一行
- amazon-web-services - 向我的服务器区域以外的区域收取 AWS 数据传输费用
- spring-boot - 是否有任何工具可以将现有的 Spring 应用程序迁移到 Spring Boot 应用程序?
- hibernate - 在 Spring Boot 中使用 Junit 5 进行测试失败
- javascript - 使用 Webpack 和 NPM 更改 Node 模块?
- postgresql - Postgres 查询从给定文本中获取特定文本
- javascript - 如何使用子 process.exec 模块切换或最小化窗口
- c# - 在文本框中的一行中读取特定内容并放入 windowsform
- c++ - GCC 7中模板类的模板成员函数的特化