如何使用 PyQt6 或 PyQt5 将 MimeTypeFilters 和 NameFilters 组合到 QFileDialog 中?

问题描述 投票:0回答:1

使用 PyQt6,我正在研究直接使用 QFileDialog,而不使用静态函数之一(即不使用 QFileDialog.getOpenFileName)。我遇到的问题是创建一个使用 MIME 类型和命名类型组合的过滤器列表。

例如,假设您要为 *.css 和 *.qss 文件设置过滤器。从本质上讲,它们本质上是相同的文件类型,但 MIME 无法识别 *.qss。我真的很喜欢使用 MIME 类型的想法,因为它确保包含文件类型的许多扩展选项(即

[*.jpg, *.jpeg, *.jpe]
[*.md, *.mkd, *.markdown]
),但我还需要处理 MIME 中未包含的文件。

我正在使用的代码片段如下:

file_dialog = QFileDialog()
file_dialog.setFileMode(QFileDialog.FileMode.ExistingFiles)
file_dialog.setMimeTypeFilters(["text/css",
                                "application/octet-stream"])
file_dialog.setNameFilter("Qt Style Sheet (*.qss)")

if file_dialog.exec():
    print(file_dialog.selectedFiles())

执行此代码时,

.setNameFilter
函数将完全覆盖使用
.setMimeTypeFilters
函数设置的过滤器。如果我颠倒过滤器设置的顺序,同样的事情也会发生相反的情况。

我也尝试将名称过滤器添加到 MIME 类型列表中,但名称过滤器只是被忽略。

file_dialog.setMimeTypeFilters(["text/css",
                                "Qt Style Sheet (*.qss)",
                                "application/octet-stream"])

任何人都知道一种方法来拥有两个过滤器,而不必显式设置所有选项并使用

.setMimeTypeFilters
取消?

python pyqt mime-types qfiledialog
1个回答
0
投票

setMimeTypeFilters()

文档中,其中指出(1)setMimeTypeFilters()是“setNameFilters()的便捷方法”,并且(2)“调用setMimeTypeFilters会覆盖任何先前设置的名称过滤器”,我们可以得出结论: 
setMimeTypeFilters()
除了设置命名过滤器之外什么也不做。遵循此相关问题,我们可以通过以下步骤利用它来获益:

  1. 使用
    setMimeTypeFilters()
    设置 MIME 类型过滤器。
  2. 使用
    nameFilters()
    获取生成的命名过滤器。
  3. 在结果列表中插入我们命名的过滤器,例如与
    append()
  4. 使用已完成的列表,通过
    setNameFilters(name_filters)
    设置命名过滤器。

这可能如下所示:

from PyQt5.QtWidgets import QFileDialog

file_dialog = QFileDialog()
file_dialog.setFileMode(QFileDialog.FileMode.ExistingFiles)
file_dialog.setMimeTypeFilters(["text/css",
                                "application/octet-stream"])
name_filters = file_dialog.nameFilters()
name_filters.append("Qt Style Sheet (*.qss)")
file_dialog.setNameFilters(name_filters)

if file_dialog.exec():
    print(file_dialog.selectedFiles())
© www.soinside.com 2019 - 2024. All rights reserved.