【问题标题】:QFileDialog previewQFileDialog 预览
【发布时间】:2017-12-01 18:12:18
【问题描述】:

我正在尝试获取一个 Qt5 QFileDialog,以便在选择图像进行打开时显示预览。

方法一:扩展QFileDialog
我使用了this implementation of the dialog,它适用于 Qt 5.6.1。

现在我使用的是 Qt 5.9.2,它不再工作,出现以下错误:

Traceback (most recent call last):
  File "main.py", line 74, in mouseDoubleClickEvent
    self.openFileDialog()
  File "main.py", line 123, in openFileDialog
    openDialog = QFileDialogPreview(self, 'Open file', './', self.getDialogFilter())
  File "QFileDialogPreview.py", line 22, in __init__
    self.layout().addLayout(box, 1, 3, 1, 1)
TypeError: addLayout(self, QLayout, stretch: int = 0): too many arguments

这是翻译后的课程。我正在使用 Python 3.5.2:

from PyQt5.QtWidgets import QFileDialog, QLabel, QVBoxLayout
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt

class QFileDialogPreview(QFileDialog):
    def __init__(self, parent, caption, direcotry, filter):
        super().__init__(parent, caption, direcotry, filter)

        self.setObjectName("FileDialogPreview")
        box = QVBoxLayout(self)

        self.setFixedSize(self.width() + 250, self.height())

        self.mpPreview = QLabel("Preview", self)
        self.mpPreview.setFixedSize(250, 250)
        self.mpPreview.setAlignment(Qt.AlignCenter)
        self.mpPreview.setObjectName("labelPreview")
        box.addWidget(self.mpPreview)

        box.addStretch()

        self.layout().addLayout(box, 1, 3, 1, 1)

        self.currentChanged.connect(self.onChange)
        self.fileSelected.connect(self.onFileSelected)
        self.filesSelected.connect(self.onFilesSelected)

        self._fileSelected = None
        self._filesSelected = None

    def onChange(self, path):
        pixmap = QPixmap(path)

        if(pixmap.isNull()):
            self.mpPreview.setText("Preview")
        else:
            self.mpPreview.setPixmap(pixmap.scaled(self.mpPreview.width(), self.mpPreview.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation))

    def onFileSelected(self, file):
        self._fileSelected = file

    def onFilesSelected(self, files):
        self._filesSelected = files

    def getFileSelected(self):
        return self._fileSelected

    def getFilesSelected(self):
        return self._filesSelected

方法二:单独预览窗口

我还尝试为预览添加一个单独的窗口。虽然它在 QFileDialog 中被选中时显示图像,但我无法将其附加到 Dialog 本身的一侧。
我无法使用 dialog.gemoetry() 上的 mapToGlobal 方法将对话框的位置映射到全局屏幕坐标。在这种情况下,我得到的只是一个包含位置 0,0 的 QRect,其大小不匹配为 100x30,而对话框大约为 800x600,大约为 2000、500。

【问题讨论】:

  • 如果你能画出你预期的结果,人们可以更容易地帮助你。
  • 要么是由右侧小部件扩展的普通文件打开对话框,要么是包含我的预览小部件的对话框右侧的单独窗口

标签: python pyqt pyqt5 qfiledialog


【解决方案1】:

当你放置box = QVBoxLayout(self)时,你正在放置一个新的布局,你必须做的是使用QFileDialog自己的Qt,为此我们启用DontUseNativeDialog标志,除了从box语句中删除self :

class QFileDialogPreview(QFileDialog):
    def __init__(self, *args, **kwargs):
        QFileDialog.__init__(self, *args, **kwargs)
        self.setOption(QFileDialog.DontUseNativeDialog, True)

        box = QVBoxLayout()

        self.setFixedSize(self.width() + 250, self.height())

        self.mpPreview = QLabel("Preview", self)
        self.mpPreview.setFixedSize(250, 250)
        self.mpPreview.setAlignment(Qt.AlignCenter)
        self.mpPreview.setObjectName("labelPreview")
        box.addWidget(self.mpPreview)

        box.addStretch()

        self.layout().addLayout(box, 1, 3, 1, 1)

        self.currentChanged.connect(self.onChange)
        self.fileSelected.connect(self.onFileSelected)
        self.filesSelected.connect(self.onFilesSelected)

        self._fileSelected = None
        self._filesSelected = None

    def onChange(self, path):
        pixmap = QPixmap(path)

        if(pixmap.isNull()):
            self.mpPreview.setText("Preview")
        else:
            self.mpPreview.setPixmap(pixmap.scaled(self.mpPreview.width(), self.mpPreview.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation))

    def onFileSelected(self, file):
        self._fileSelected = file

    def onFilesSelected(self, files):
        self._filesSelected = files

    def getFileSelected(self):
        return self._fileSelected

    def getFilesSelected(self):
        return self._filesSelected

输出:

【讨论】:

    【解决方案2】:

    除了@eyllanesc 对该主题的回答之外,我最初无法弄清楚如何专门调用该类来打开多个文件(当然,预览只会在选择单个文件时起作用)。所以下面的几行展示了如何做到这一点。 (将此作为单独的答案发布,而不是评论,因为代码包含多行)

    ## For selecting a single file
    def openBtn_single_clicked(self):
        
        filedialog = QFileDialogPreview(self,"Open File",
            "","Image Files (*.png *.jpg *.jpeg)")
        filedialog.setFileMode(QFileDialog.ExistingFile)
        if filedialog.exec_() == QFileDialogPreview.Accepted:
            print(filedialog.getFileSelected())
    
        return
    
    
    ## For selecting multiple files
    def openBtn_multiple_clicked(self):
        filedialog = QFileDialogPreview(self,"Open File",
            "","PDF Files (*.pdf)")
        filedialog.setFileMode(QFileDialog.ExistingFiles)
        if filedialog.exec_() == QFileDialogPreview.Accepted:
            print(filedialog.getFilesSelected())
    
        return
    

    这两个功能都需要通过命令偏离路线附加到按钮

    openBtnSingleFile.clicked.connect(self.openBtn_single_clicked)
    openBtnMultipleFiles.clicked.connect(self.openBtn_multiple_clicked)
    

    【讨论】:

      猜你喜欢
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      • 2017-09-04
      相关资源
      最近更新 更多