QFileDialog 预览
QFileDialog preview
我正在尝试让 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
这是翻译后的 class。我正在使用 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
方法二:单独window进行预览
我还尝试为预览添加一个单独的 window。当它在 QFileDialog 中被选中时显示图像时,我无法将它附加到对话框本身的一侧。
我无法使用 dialog.gemoetry() 上的 mapToGlobal 方法将对话框的位置映射到全局屏幕坐标。我得到的只是一个包含位置 0,0 的 QRect,在这种情况下大小不匹配为 100x30,而对话框大约为 800x600,大致在 2000、500。
当你放置box = QVBoxLayout(self)
时,你正在放置一个新的布局,你必须做的是使用QFileDialog
自己的Qt,为此我们启用DontUseNativeDialog
标志,另外从框语句中删除自我:
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
输出:
除了@eyllanesc 关于该主题的回答外,我最初无法弄清楚如何调用 class 专门打开多个文件(当然,预览仅在单个文件时有效被选中)。所以下面几行显示了如何做到这一点。 (将此作为单独的答案发布,而不是评论,因为代码包含多行)
## 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)
我正在尝试让 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
这是翻译后的 class。我正在使用 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
方法二:单独window进行预览
我还尝试为预览添加一个单独的 window。当它在 QFileDialog 中被选中时显示图像时,我无法将它附加到对话框本身的一侧。
我无法使用 dialog.gemoetry() 上的 mapToGlobal 方法将对话框的位置映射到全局屏幕坐标。我得到的只是一个包含位置 0,0 的 QRect,在这种情况下大小不匹配为 100x30,而对话框大约为 800x600,大致在 2000、500。
当你放置box = QVBoxLayout(self)
时,你正在放置一个新的布局,你必须做的是使用QFileDialog
自己的Qt,为此我们启用DontUseNativeDialog
标志,另外从框语句中删除自我:
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
输出:
除了@eyllanesc 关于该主题的回答外,我最初无法弄清楚如何调用 class 专门打开多个文件(当然,预览仅在单个文件时有效被选中)。所以下面几行显示了如何做到这一点。 (将此作为单独的答案发布,而不是评论,因为代码包含多行)
## 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)