QFileDialog 只显示某些文件
Only display certain files in 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' 的文件,这样当我 运行 文件时,唯一显示的文件是 'spam.txt', 'spam_eggs_and_spam.txt' 和 'spam_eggs_tomato_and_spam.txt'。
要仅显示包含单词 'spam' 的文件,您可以添加:
dialog.setNameFilters(["*spam*"])
您可以像这样简单地添加一个过滤器:
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_()
这是我编写的示例代码:
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' 的文件,这样当我 运行 文件时,唯一显示的文件是 'spam.txt', 'spam_eggs_and_spam.txt' 和 'spam_eggs_tomato_and_spam.txt'。
要仅显示包含单词 'spam' 的文件,您可以添加:
dialog.setNameFilters(["*spam*"])
您可以像这样简单地添加一个过滤器:
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_()