首页 > 解决方案 > 如何右键保存图片或文件?

问题描述

我写了一个 pyqt5 代码来显示来自我们本地计算机的图片或文件。在此之后,我不知道将窗口中显示的图片或文件保存在其他路径上。我想出的唯一方法是复制它们。任何建议或提示将不胜感激。

这是显示图片或文件的代码:

import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

class fileDialogdemo(QWidget):
    def __init__(self,parent=None):
        super(fileDialogdemo, self).__init__(parent)
        layout=QVBoxLayout()

        self.btn=QPushButton("Load Picture")
        self.btn.clicked.connect(self.getimage)
        layout.addWidget(self.btn)

        self.le=QLabel('')
        layout.addWidget(self.le)

        self.btn1=QPushButton('Load text file')
        self.btn1.clicked.connect(self.getFiles)
        layout.addWidget(self.btn1)

        self.contents=QTextEdit()
        layout.addWidget(self.contents)

        self.setLayout(layout)
        self.setWindowTitle('File Dialog ')

    def getimage(self):
        image_file,_=QFileDialog.getOpenFileName(self,'Open file','C:\\','Image files (*.jpg *.gif *.png *.jpeg)')
        self.le.setPixmap(QPixmap(image_file))

    def getFiles(self):
        dig=QFileDialog()
        dig.setFileMode(QFileDialog.AnyFile)
        dig.setFilter(QDir.Files)

        if dig.exec_():
            filenames=dig.selectedFiles()
            f=open(filenames[0],'r')

            with f:
                data=f.read()
                self.contents.setText(data)

if __name__ == '__main__':
    app=QApplication(sys.argv)
    ex=fileDialogdemo()
    ex.show()
    sys.exit(app.exec_())

这是我正在尝试保存的代码,但是有问题:

def contextMenuEvent(self, event):
    cmenu = QMenu(self)
    saveAct = cmenu.addAction("Save as")
    action = cmenu.exec_(self.mapToGlobal(event.pos()))
    if action == saveAct:
        filename = QFileDialog.getSaveFileName(self)
        shutil.copyfile(self.image_file, filename) 

除了复制的想法,还有什么更好的方法吗?

标签: pythonpyqt5

解决方案


不要复制图像,因为没有人保证加载图像后原始图像在同一位置或仍然存在。相反,从 QLabel 检索 QPixmap 并保存它:

def contextMenuEvent(self, event):
    cmenu = QMenu(self)
    saveAct = cmenu.addAction("Save as")
    action = cmenu.exec_(self.mapToGlobal(event.pos()))
    if action == saveAct:
        filename, _ = QFileDialog.getSaveFileName(self)
        pixmap = self.le.pixmap()
        if pixmap is not None and filename:
            pixmap.save(filename)

推荐阅读