Отображать только определенные файлы в QFileDialog - PullRequest
0 голосов
/ 10 мая 2018

Вот пример кода, который я написал:

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_()

Когда я его запускаю, я получаю следующее: enter image description here

Это всефайлы в моем каталоге.Я хотел бы отфильтровать файлы, в названии которых нет слова «спам», чтобы при запуске файла отображались только файлы «spam.txt», «spam_eggs_and_spam.txt» и «spam_eggs_tomato_and_spam.txt.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы можете просто добавить фильтр следующим образом:

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_()
0 голосов
/ 10 мая 2018

Чтобы показывать только файлы со словом «спам», вы можете добавить:

dialog.setNameFilters(["*spam*"])

...