使用 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
取消?
setMimeTypeFilters()
除了设置命名过滤器之外什么也不做。遵循此相关问题,我们可以通过以下步骤利用它来获益:
setMimeTypeFilters()
设置 MIME 类型过滤器。nameFilters()
获取生成的命名过滤器。append()
。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())