如何解决有没有办法在PyQt中选择目录并显示其中的文件?
我希望用户选择一个包含要分析的文件的目录。我只想让用户选择一个目录,而不是其中的文件。我正在使用:
QFileDialog.getExistingDirectory
这仅显示目录(即使存在文件也未列出)。这可能是正确的行为,但是查看其中的文件可能对用户有所帮助。理想情况下,其中的文件是可见的但不能选择
我可以使用
"query": {
"match": {
"description": {
"query": "apple","operator": "and"
}
}
}
,然后选择他们选择的文件的父目录。这种方法并不完美,因为他们正在选择文件而不是文件目录。
想知道是否有任何想法或建议吗?
解决方法
QFileDialog静态方法不允许这种方法,而且最重要的是,Qt始终尝试使用基础操作系统提供的 native 文件对话框,对此没有可用的访问/控制
解决方案是使用定制的QFileDialog实例,确保它不使用本机对话框并设置相对选项。
由于您还希望将所有非目录项显示为已禁用,因此我们还需要将自定义的代理模型应用于对话框。请注意,实际上并不需要执行此步骤,因为使用setFileMode(dialog.Directory)
已经可以确保所选项目实际上是一个目录,否则不允许打开当前所选项目。
from PyQt5 import QtCore,QtWidgets
class DirProxyModel(QtCore.QSortFilterProxyModel):
def __init__(self,fsModel):
super().__init__()
self.fsModel = fsModel
self.setSourceModel(fsModel)
def lessThan(self,left,right):
# QFileSystemModel populates its entries with some delay,which results
# in the proxy model not able to do the proper sorting (usually showing
# directories first) since the proxy does not always "catch up" with the
# source sorting; so,this has to be manually overridden by
# force-checking the entry type of the index.
leftIsDir = self.fsModel.fileInfo(left).isDir()
if leftIsDir != self.fsModel.fileInfo(right).isDir():
return leftIsDir
return super().lessThan(left,right)
def flags(self,index):
flags = super().flags(index)
# map the index to the source and check if it's a directory or not
if not self.fsModel.fileInfo(self.mapToSource(index)).isDir():
# if it is a directory,remove the enabled flag
flags &= ~QtCore.Qt.ItemIsEnabled
return flags
class Test(QtWidgets.QWidget):
def __init__(self):
super().__init__()
layout = QtWidgets.QHBoxLayout(self)
self.lineEdit = QtWidgets.QLineEdit()
layout.addWidget(self.lineEdit)
self.selectBtn = QtWidgets.QToolButton(text='...')
layout.addWidget(self.selectBtn)
self.selectBtn.clicked.connect(self.selectDirectory)
def selectDirectory(self):
dialog = QtWidgets.QFileDialog(self,windowTitle='Select directory')
dialog.setDirectory(self.lineEdit.text() or __file__)
dialog.setFileMode(dialog.Directory)
dialog.setOptions(dialog.DontUseNativeDialog)
# find the underlying model and set our own proxy model for it
for view in self.findChildren(QtWidgets.QAbstractItemView):
if isinstance(view.model(),QtWidgets.QFileSystemModel):
proxyModel = DirProxyModel(view.model())
dialog.setProxyModel(proxyModel)
break
# try to hide the file filter combo
fileTypeCombo = dialog.findChild(QtWidgets.QComboBox,'fileTypeCombo')
if fileTypeCombo:
fileTypeCombo.setVisible(False)
dialog.setLabelText(dialog.FileType,'')
if dialog.exec_():
self.lineEdit.setText(dialog.selectedFiles()[0])
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Test()
w.show()
sys.exit(app.exec_())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。