python - 仅在 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'。
解决方案
您可以简单地添加这样的过滤器:
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_()
推荐阅读
- python - beautifulsoup 网络爬虫搜索id列表
- java - 如何在 Java 方法中引用基于文本的基本游戏清单的类实例?
- fortran - 来自 Fortran 内在函数的表观混合模式算术
- javascript - 桌面放大时如何解决溢出问题(移动响应式网站)
- python - pandas.DataFrame.apply() 使用方括号过滤时产生 NaN
- c# - Asp.Net 和 Asp.Net Core 应用程序之间的共享会话
- matlab - 如何改进此代码以从 MATLAB 中的另一个矩阵中替换矩阵的元素?
- node.js - 在已经有别名的表上进行连接
- php - 多选的话会涨价
- javascript - JQuery:如何在隐藏元素上触发点击事件?