This working code brings up a QFileDialog prompting the user to select a .csv file:
def load(self,fileName=None): if not fileName: fileName=fileDialog.getOpenFileName(caption="Load Existing Radio Log",filter="csv (*.csv)") ... ...
Now, I'd like to change that filter to be more selective. The program saves each project as a set of three .csv files (project.csv, project_fleetsync.csv, project_clueLog.csv) but I only want the file dialog to display the first one (project.csv) in order to avoid presenting the user with too many choices when only a third of them can be handled by the rest of the load() function.
According to this post, it looks like the solution is to use a proxy model. So, I changed the code to the following (all of the commented lines in load() are things I've tried in various combinations):
def load(self,fileName=None): if not fileName: fileDialog=QFileDialog() fileDialog.setProxyModel(CSVFileSortFilterProxyModel(self)) # fileDialog.setNameFilter("CSV (*.csv)") # fileDialog.setOption(QFileDialog.DontUseNativeDialog) # fileName=fileDialog.getOpenFileName(caption="Load Existing Radio Log",filter="csv (*.csv)") # fileName=fileDialog.getOpenFileName(caption="Load Existing Radio Log") # fileDialog.exec_() ... ... # code for CSVFileSortFilterProxyModel partially taken from # https://github.com/ZhuangLab/storm-control/blob/master/steve/qtRegexFileDialog.py class CSVFileSortFilterProxyModel(QSortFilterProxyModel): def __init__(self,parent=None): print("initializing CSVFileSortFilterProxyModel") super(CSVFileSortFilterProxyModel,self).__init__(parent) # filterAcceptsRow - return True if row should be included in the model, False otherwise # # do not list files named *_fleetsync.csv or *_clueLog.csv # do a case-insensitive comparison just in case def filterAcceptsRow(self,source_row,source_parent): print("CSV filterAcceptsRow called") source_model=self.sourceModel() index0=source_model.index(source_row,0,source_parent) # Always show directories if source_model.isDir(index0): return True # filter files filename=source_model.fileName(index0) # filename=self.sourceModel().index(row,0,parent).data().lower() print("testing lowercased filename:"+filename) if filename.count("_fleetsync.csv")+filename.count("_clueLog.csv")==0: return True else: return False
When I call the load() function, I do get the "initializing CSVFileSortFilterProxyModel" output, but apparently filterAcceptsRow is not getting called: there is no "CSV filterAcceptsRow called" output, and, the _fleetsync.csv and _clueLog.csv files are still listed in the dialog. Clearly I'm doing something wrong...?