首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QFileDialog预览

QFileDialog预览
EN

Stack Overflow用户
提问于 2017-12-01 18:12:18
回答 2查看 1.6K关注 0票数 2

我正在尝试获得一个Qt5 QFileDialog,在选择图片打开时显示它们的预览。

方法1:扩展QFileDialog

我使用了这个对话框的实现,它与QT5.6.1一起工作。

现在我使用的是QT5.9.2,它不再工作了,给出了以下错误:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

方法2:预览的单独窗口

我还尝试为预览添加一个单独的窗口。当它在QFileDialog中被选中时,它会显示图像,但我没有将它附加到对话框本身的一侧。

我无法使用mapToGlobal方法在dialog.gemoetry()上获得映射到全局屏幕坐标的对话框位置。我得到的只是一个包含0,0位置的QRect,在本例中,这个位置的大小与100x30不匹配,而对话框大约是800x600,大约在2000,500。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-01 18:36:41

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

代码语言:javascript
复制
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

输出:

票数 4
EN

Stack Overflow用户

发布于 2020-07-27 06:48:53

除了关于这个主题的@eyllanesc答案之外,我一开始还不知道如何专门调用类来打开多个文件(当然,只有选择一个文件时,预览才能正常工作)。下面的行显示了如何做到这一点。(将此作为单独的答复发布,而不是注释,因为代码包含多行代码)

代码语言:javascript
复制
## 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

这两个函数都需要通过命令连接到按钮上。

代码语言:javascript
复制
openBtnSingleFile.clicked.connect(self.openBtn_single_clicked)
openBtnMultipleFiles.clicked.connect(self.openBtn_multiple_clicked)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47599170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档