In PyQt5 there exists QtWidgets.QFileDialog() which allow user to chose file from disc. I would like to have files sorted by date ascending in this window at entering (it is possible with user action). As I've been looking by web i found issues (1, 2) around topic, but still I cannot achieve that. It seems that QFileDialog does not have this option as common one, but it could be done with setting properly ProxyModel with setProxyModel(). I did it and it seems to have no effect, how sorting by date can be achieved?
from PyQt5 import QtWidgets, QtCore, QtGui
import sys
import os
def file_name_dialog(extension="All Files (*);;Python Files (*.py)", local_folder="", operation="Open"):
options = QtWidgets.QFileDialog.Options()
options |= QtWidgets.QFileDialog.DontUseNativeDialog
dialog = QtWidgets.QFileDialog()
dialog.setOptions(options)
local_path = os.getcwd()
dialog.setDirectory(local_path+local_folder)
sorter = QtCore.QSortFilterProxyModel() #QAbstractProxyModel QFileDialog sort
sorter.setDynamicSortFilter(True)
sorter.sort(2, QtCore.Qt.SortOrder.AscendingOrder)
dialog.setProxyModel(sorter) #doesnt work :(
if operation == "Open":
file_path, _ = dialog.getOpenFileName(None, local_folder, "", extension, options=options)
else:
file_path, _ = dialog.getSaveFileName(None, local_folder, "", extension, options=options)
if file_path:
return file_path
else:
return None
app = QtWidgets.QApplication(sys.argv)
myapp = QtWidgets.QMainWindow()
myapp.show()
file_name_dialog()
sys.exit(app.exec_())
===edit===
This function sorts files ascending, but only by name - it is not possible to select column.
def file_name_dialog(self, extension="All Files (*);;Python Files (*.py)", local_folder="/config", operation="Open"):
options = QtWidgets.QFileDialog.Options()
options |= QtWidgets.QFileDialog.DontUseNativeDialog
dialog = QtWidgets.QFileDialog()
dialog.setOptions(options)
local_path = os.getcwd()
dialog.setDirectory(local_path+local_folder)
sorter = QtCore.QSortFilterProxyModel() #QAbstractProxyModel QFileDialog sort
dialog.setProxyModel(sorter)
sorter.setDynamicSortFilter(True)
sorter.sort(3, QtCore.Qt.SortOrder.AscendingOrder)
dialog.setProxyModel(sorter)
import threading
import time
def run_task_handler():
time.sleep(0.2)
sorter.sort(3, QtCore.Qt.SortOrder.AscendingOrder)
dialog.proxyModel().sort(3, QtCore.Qt.SortOrder.AscendingOrder)
thread_task_handler = threading.Thread(target=run_task_handler)
thread_task_handler.start()
#dialog.setFilter(QtCore.QDir(extension).filter())
dialog.setFileMode(QtWidgets.QFileDialog.FileMode.ExistingFile)
file_path = False
if dialog.exec_():
file_path = dialog.selectedFiles()[0]
if file_path:
return file_path
else:
warn("No file chosen")
return None