首页 > 解决方案 > 仅在 QFileDialog 中显示某些文件

问题描述

这是我编写的示例代码:

from PyQt5.QtWidgets import (QApplication, QMainWindow, QFileDialog)
import sys


class Window(QMainWindow):

    def __init__(self):
        QMainWindow.__init__(self)
        dialog = QFileDialog()
        dialog.exec()

app = QApplication(sys.argv)
window = Window()
window.show()
app.exec_()

当我运行它时,我得到以下信息: 在此处输入图像描述

这些是我目录中的所有文件。我想过滤掉标题中没有“垃圾邮件”一词的文件,这样当我运行文件时,显示的唯一文件是“spam.txt”、“spam_eggs_and_spam.txt”和“ spam_eggs_tomato_and_spam.txt'。

标签: pythonpyqtpyqt5qfiledialog

解决方案


您可以简单地添加这样的过滤器:

dialog = QFileDialog()
dialog.setNameFilter("Text Spam Files (*spam*.txt)")
dialog.exec()

但如果用户在文件名字段中键入 *.*,它可以被覆盖。

一个更好的方法是实现你自己的QSortFilterProxyModel,这是我的尝试:

from PyQt5.QtWidgets import (QApplication, QMainWindow, QFileDialog)
from PyQt5.QtCore import QSortFilterProxyModel, QModelIndex
import sys


class FileFilterProxyModel(QSortFilterProxyModel):
    def __init__(self, parent=None):
        super(QSortFilterProxyModel, self).__init__(parent)

    def filterAcceptsRow(self, source_row: int, source_parent: QModelIndex) -> bool:
        source_model = self.sourceModel()
        index0 = source_model.index(source_row, 0, source_parent)
        if source_model.isDir(index0):
            return True
        return 'spam' in source_model.fileName(index0).lower()


class Window(QMainWindow):

    def __init__(self):
        QMainWindow.__init__(self)
        dialog = QFileDialog()
        dialog.setOption(QFileDialog.DontUseNativeDialog)
        dialog.setProxyModel(FileFilterProxyModel())
        dialog.setNameFilter("Text Files (*.txt)")
        dialog.exec()


app = QApplication(sys.argv)
window = Window()
window.show()
app.exec_()

推荐阅读