Skip to content

Commit eba6101

Browse files
committedSep 5, 2016
Fix broken python save/open dialogs under PyQt5
Will break stuff under PyQt4... oh well, better stuff working on Qt5 then Qt4
1 parent e54f9be commit eba6101

21 files changed

+66
-66
lines changed
 

‎python/console/console.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ def openScriptFileExtEditor(self):
623623
def openScriptFile(self):
624624
lastDirPath = self.settings.value("pythonConsole/lastDirPath", QDir.homePath())
625625
openFileTr = QCoreApplication.translate("PythonConsole", "Open File")
626-
fileList = QFileDialog.getOpenFileNames(
626+
fileList, selected_filter = QFileDialog.getOpenFileNames(
627627
self, openFileTr, lastDirPath, "Script file (*.py)")
628628
if fileList:
629629
for pyFile in fileList:
@@ -663,9 +663,9 @@ def saveAsScriptFile(self, index=None):
663663
pathFileName = tabWidget.path
664664
fileNone = False
665665
saveAsFileTr = QCoreApplication.translate("PythonConsole", "Save File As")
666-
filename = QFileDialog.getSaveFileName(self,
667-
saveAsFileTr,
668-
pathFileName, "Script file (*.py)")
666+
filename, filter = QFileDialog.getSaveFileName(self,
667+
saveAsFileTr,
668+
pathFileName, "Script file (*.py)")
669669
if filename:
670670
try:
671671
tabWidget.save(filename)

‎python/console/console_editor.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -802,10 +802,10 @@ def save(self, fileName=None):
802802
if self.path is None:
803803
saveTr = QCoreApplication.translate('PythonConsole',
804804
'Python Console: Save file')
805-
self.path = QFileDialog().getSaveFileName(self,
806-
saveTr,
807-
self.tw.tabText(index) + '.py',
808-
"Script file (*.py)")
805+
self.path, filter = QFileDialog().getSaveFileName(self,
806+
saveTr,
807+
self.tw.tabText(index) + '.py',
808+
"Script file (*.py)")
809809
# If the user didn't select a file, abort the save operation
810810
if len(self.path) == 0:
811811
self.path = None

‎python/console/console_settings.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ def enableDisable(self, value):
7373
def loadAPIFile(self):
7474
settings = QSettings()
7575
lastDirPath = settings.value("pythonConsole/lastDirAPIPath", "", type=str)
76-
fileAPI = QFileDialog.getOpenFileName(
76+
fileAPI, selected_filter = QFileDialog.getOpenFileName(
7777
self, "Open API File", lastDirPath, "API file (*.api)")
7878
if fileAPI:
7979
self.addAPI(fileAPI)
@@ -83,10 +83,10 @@ def loadAPIFile(self):
8383

8484
def _prepareAPI(self):
8585
if self.tableWidget.rowCount() != 0:
86-
pap_file = QFileDialog().getSaveFileName(self,
87-
"",
88-
'*.pap',
89-
"Prepared APIs file (*.pap)")
86+
pap_file, filter = QFileDialog().getSaveFileName(self,
87+
"",
88+
'*.pap',
89+
"Prepared APIs file (*.pap)")
9090
else:
9191
QMessageBox.information(self, self.tr("Warning!"),
9292
self.tr('You need to add some APIs file in order to compile'))

‎python/plugins/GdalTools/tools/GdalTools_utils.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ def getDialog(self, parent=None, caption='', acceptMode=QFileDialog.AcceptOpen,
447447
def getOpenFileNames(self, parent=None, caption='', filter='', selectedFilter=None, useEncoding=False):
448448
if useEncoding:
449449
return self.getDialog(parent, caption, QFileDialog.AcceptOpen, QFileDialog.ExistingFiles, filter, selectedFilter, useEncoding)
450-
res = QFileDialog.getOpenFileNames(parent, caption, getLastUsedDir(), filter)
450+
res, selected_filter = QFileDialog.getOpenFileNames(parent, caption, getLastUsedDir(), filter)
451451
if len(res) > 0:
452452
setLastUsedDir(res[-1])
453453
return res
@@ -456,7 +456,7 @@ def getOpenFileNames(self, parent=None, caption='', filter='', selectedFilter=No
456456
def getOpenFileName(self, parent=None, caption='', filter='', selectedFilter=None, useEncoding=False):
457457
if useEncoding:
458458
return self.getDialog(parent, caption, QFileDialog.AcceptOpen, QFileDialog.ExistingFile, filter, selectedFilter, useEncoding)
459-
res = QFileDialog.getOpenFileName(parent, caption, getLastUsedDir(), filter)
459+
res, selected_filter = QFileDialog.getOpenFileName(parent, caption, getLastUsedDir(), filter)
460460
if res:
461461
setLastUsedDir(res)
462462
return res
@@ -465,7 +465,7 @@ def getOpenFileName(self, parent=None, caption='', filter='', selectedFilter=Non
465465
def getSaveFileName(self, parent=None, caption='', filter='', selectedFilter=None, useEncoding=False):
466466
if useEncoding:
467467
return self.getDialog(parent, caption, QFileDialog.AcceptSave, QFileDialog.AnyFile, filter, selectedFilter, useEncoding)
468-
res = QFileDialog.getSaveFileName(parent, caption, getLastUsedDir(), filter)
468+
res, filter = QFileDialog.getSaveFileName(parent, caption, getLastUsedDir(), filter)
469469
if res:
470470
setLastUsedDir(res)
471471
return res

‎python/plugins/MetaSearch/dialogs/manageconnectionsdialog.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ def select_file(self):
7373

7474
if self.mode == 0:
7575
slabel = self.tr('Save connections')
76-
self.filename = QFileDialog.getSaveFileName(self, slabel,
77-
'.', label)
76+
self.filename, filter = QFileDialog.getSaveFileName(self, slabel,
77+
'.', label)
7878
else:
7979
slabel = self.tr('Load connections')
80-
self.filename = QFileDialog.getOpenFileName(self, slabel,
81-
'.', label)
80+
self.filename, selected_filter = QFileDialog.getOpenFileName(self, slabel,
81+
'.', label)
8282

8383
if not self.filename:
8484
return

‎python/plugins/db_manager/db_plugins/spatialite/plugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def addConnection(self, conn_name, uri):
8989
def addConnectionActionSlot(self, item, action, parent, index):
9090
QApplication.restoreOverrideCursor()
9191
try:
92-
filename = QFileDialog.getOpenFileName(parent, "Choose Sqlite/Spatialite/Geopackage file")
92+
filename, selected_filter = QFileDialog.getOpenFileName(parent, "Choose Sqlite/Spatialite/Geopackage file")
9393
if not filename:
9494
return
9595
finally:

‎python/plugins/db_manager/dlg_export_vector.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ def chooseOutputFile(self):
7575
selectedFilter = self.cboFileFormat.itemData(self.cboFileFormat.currentIndex())
7676

7777
# ask for a filename
78-
filename = QFileDialog.getSaveFileName(self, self.tr("Choose where to save the file"), lastUsedDir,
79-
selectedFilter)
78+
filename, filter = QFileDialog.getSaveFileName(self, self.tr("Choose where to save the file"), lastUsedDir,
79+
selectedFilter)
8080
if filename == "":
8181
return
8282

‎python/plugins/db_manager/dlg_import_vector.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ def chooseInputFile(self):
130130
lastDir = settings.value("/db_manager/lastUsedDir", "")
131131
lastVectorFormat = settings.value("/UI/lastVectorFileFilter", "")
132132
# ask for a filename
133-
(filename, lastVectorFormat) = QFileDialog.getOpenFileNameAndFilter(self, self.tr("Choose the file to import"),
134-
lastDir, vectorFormats, lastVectorFormat)
133+
filename, lastVectorFormat = QFileDialog.getOpenFileName(self, self.tr("Choose the file to import"),
134+
lastDir, vectorFormats, lastVectorFormat)
135135
if filename == "":
136136
return
137137
# store the last used dir and format

‎python/plugins/processing/gui/BatchInputSelectionPanel.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ def showFileSelectionDialog(self):
125125
else:
126126
path = ''
127127

128-
ret = QFileDialog.getOpenFileNames(self, self.tr('Open file'), path,
129-
self.tr('All files(*.*);;') + self.param.getFileFilter())
128+
ret, selected_filter = QFileDialog.getOpenFileNames(self, self.tr('Open file'), path,
129+
self.tr('All files(*.*);;') + self.param.getFileFilter())
130130
if ret:
131131
files = list(ret)
132132
settings.setValue('/Processing/LastInputPath',

‎python/plugins/processing/gui/BatchOutputSelectionPanel.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ def showSelectionDialog(self):
7979
path = unicode(settings.value('/Processing/LastBatchOutputPath'))
8080
else:
8181
path = ''
82-
filename, selectedFileFilter = QFileDialog.getSaveFileNameAndFilter(self,
83-
self.tr('Save file'), path, filefilter)
82+
filename, selectedFileFilter = QFileDialog.getSaveFileName(self,
83+
self.tr('Save file'), path, filefilter)
8484
# fix_print_with_import
8585
print(filename, selectedFileFilter)
8686
if filename:

‎python/plugins/processing/gui/BatchPanel.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,9 @@ def getWidgetFromParameter(self, param, row, col):
179179
return item
180180

181181
def load(self):
182-
filename = unicode(QFileDialog.getOpenFileName(self,
183-
self.tr('Open batch'), None,
184-
self.tr('JSON files (*.json)')))
182+
filename, selected_filter = unicode(QFileDialog.getOpenFileName(self,
183+
self.tr('Open batch'), None,
184+
self.tr('JSON files (*.json)')))
185185
if filename:
186186
with open(filename) as f:
187187
values = json.load(f)
@@ -283,10 +283,10 @@ def save(self):
283283
return
284284
toSave.append({self.PARAMETERS: algParams, self.OUTPUTS: algOutputs})
285285

286-
filename = unicode(QFileDialog.getSaveFileName(self,
286+
filename, filter = QFileDialog.getSaveFileName(self,
287287
self.tr('Save batch'),
288288
None,
289-
self.tr('JSON files (*.json)')))
289+
self.tr('JSON files (*.json)'))
290290
if filename:
291291
if not filename.endswith('.json'):
292292
filename += '.json'

‎python/plugins/processing/gui/ConfigDialog.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -400,9 +400,9 @@ def select(self):
400400
self.tr('Select directory'), lastDir,
401401
QFileDialog.ShowDirsOnly)
402402
else:
403-
selectedPath = QFileDialog.getOpenFileName(None,
404-
self.tr('Select file'), lastDir, self.tr('All files (*.*)')
405-
)
403+
selectedPath, selected_filter = QFileDialog.getOpenFileName(None,
404+
self.tr('Select file'), lastDir, self.tr('All files (*.*)')
405+
)
406406

407407
if not selectedPath:
408408
return

‎python/plugins/processing/gui/FileSelectionPanel.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ def showSelectionDialog(self):
7070
settings.setValue('/Processing/LastInputPath',
7171
os.path.dirname(folder))
7272
else:
73-
filenames = QFileDialog.getOpenFileNames(self,
74-
self.tr('Select file'), path, '*.' + self.ext)
73+
filenames, selected_filter = QFileDialog.getOpenFileNames(self,
74+
self.tr('Select file'), path, '*.' + self.ext)
7575
if filenames:
7676
self.leText.setText(u';'.join(filenames))
7777
settings.setValue('/Processing/LastInputPath',

‎python/plugins/processing/gui/HistoryDialog.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ def clearLog(self):
8484
self.fillTree()
8585

8686
def saveLog(self):
87-
fileName = QFileDialog.getSaveFileName(self,
88-
self.tr('Save file'), '.', self.tr('Log files (*.log *.LOG)'))
87+
fileName, filter = QFileDialog.getSaveFileName(self,
88+
self.tr('Save file'), '.', self.tr('Log files (*.log *.LOG)'))
8989

9090
if fileName == '':
9191
return

‎python/plugins/processing/gui/InputLayerSelectorPanel.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ def showSelectionDialog(self):
6767
else:
6868
path = ''
6969

70-
filename = QFileDialog.getOpenFileName(self, self.tr('Select file'),
71-
path, self.tr('All files (*.*);;') + self.param.getFileFilter())
70+
filename, selected_filter = QFileDialog.getOpenFileName(self, self.tr('Select file'),
71+
path, self.tr('All files (*.*);;') + self.param.getFileFilter())
7272
if filename:
7373
settings.setValue('/Processing/LastInputPath',
7474
os.path.dirname(unicode(filename)))

‎python/plugins/processing/gui/MultipleFileInputDialog.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ def addFile(self):
9292
else:
9393
path = ''
9494

95-
files = QFileDialog.getOpenFileNames(self,
96-
self.tr('Select file(s)'), path, self.tr('All files (*.*)'))
95+
files, selected_filter = QFileDialog.getOpenFileNames(self,
96+
self.tr('Select file(s)'), path, self.tr('All files (*.*)'))
9797

9898
if len(files) == 0:
9999
return

‎python/plugins/processing/gui/RenderingStyleFilePanel.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ def __init__(self):
4646
self.btnSelect.clicked.connect(self.showSelectionDialog)
4747

4848
def showSelectionDialog(self):
49-
filename = QFileDialog.getOpenFileName(self,
50-
self.tr('Select style file'), '',
51-
self.tr('QGIS Layer Style File (*.qml *.QML)'))
49+
filename, selected_filter = QFileDialog.getOpenFileName(self,
50+
self.tr('Select style file'), '',
51+
self.tr('QGIS Layer Style File (*.qml *.QML)'))
5252
if filename:
5353
self.leText.setText(filename)
5454

‎python/plugins/processing/gui/ScriptEditorDialog.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ def openScript(self):
199199
scriptDir = RUtils.RScriptsFolders()[0]
200200
filterName = self.tr('Processing R script (*.rsx)')
201201

202-
self.filename = QFileDialog.getOpenFileName(
202+
self.filename, selected_filter = QFileDialog.getOpenFileName(
203203
self, self.tr('Open script'), scriptDir, filterName)
204204

205205
if self.filename == '':
@@ -230,9 +230,9 @@ def saveScript(self, saveAs):
230230
scriptDir = RUtils.RScriptsFolders()[0]
231231
filterName = self.tr('Processing R script (*.rsx)')
232232

233-
self.filename = unicode(QFileDialog.getSaveFileName(self,
233+
self.filename, filter = QFileDialog.getSaveFileName(self,
234234
self.tr('Save script'), scriptDir,
235-
filterName))
235+
filterName)
236236

237237
if self.filename:
238238
if self.algType == self.SCRIPT_PYTHON and \

‎python/plugins/processing/modeler/AddModelFromFileAction.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ def getIcon(self):
5151
def execute(self):
5252
settings = QSettings()
5353
lastDir = settings.value('Processing/lastModelsDir', '')
54-
filename = QFileDialog.getOpenFileName(self.toolbox,
55-
self.tr('Open model', 'AddModelFromFileAction'), lastDir,
56-
self.tr('Processing model files (*.model *.MODEL)', 'AddModelFromFileAction'))
54+
filename, selected_filter = QFileDialog.getOpenFileName(self.toolbox,
55+
self.tr('Open model', 'AddModelFromFileAction'), lastDir,
56+
self.tr('Processing model files (*.model *.MODEL)', 'AddModelFromFileAction'))
5757
if filename:
5858
try:
5959
settings.setValue('Processing/lastModelsDir',

‎python/plugins/processing/modeler/ModelerDialog.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,9 @@ def saveAs(self):
255255
self.saveModel(True)
256256

257257
def exportAsImage(self):
258-
filename = unicode(QFileDialog.getSaveFileName(self,
258+
filename, filter = QFileDialog.getSaveFileName(self,
259259
self.tr('Save Model As Image'), '',
260-
self.tr('PNG files (*.png *.PNG)')))
260+
self.tr('PNG files (*.png *.PNG)'))
261261
if not filename:
262262
return
263263

@@ -281,9 +281,9 @@ def exportAsImage(self):
281281
img.save(filename)
282282

283283
def exportAsPython(self):
284-
filename = unicode(QFileDialog.getSaveFileName(self,
284+
filename, filter = QFileDialog.getSaveFileName(self,
285285
self.tr('Save Model As Python Script'), '',
286-
self.tr('Python files (*.py *.PY)')))
286+
self.tr('Python files (*.py *.PY)'))
287287
if not filename:
288288
return
289289

@@ -308,10 +308,10 @@ def saveModel(self, saveAs):
308308
if self.alg.descriptionFile is not None and not saveAs:
309309
filename = self.alg.descriptionFile
310310
else:
311-
filename = unicode(QFileDialog.getSaveFileName(self,
311+
filename, filter = QFileDialog.getSaveFileName(self,
312312
self.tr('Save Model'),
313313
ModelerUtils.modelsFolders()[0],
314-
self.tr('Processing models (*.model)')))
314+
self.tr('Processing models (*.model)'))
315315
if filename:
316316
if not filename.endswith('.model'):
317317
filename += '.model'
@@ -340,9 +340,9 @@ def saveModel(self, saveAs):
340340
self.hasChanged = False
341341

342342
def openModel(self):
343-
filename = unicode(QFileDialog.getOpenFileName(self,
344-
self.tr('Open Model'), ModelerUtils.modelsFolders()[0],
345-
self.tr('Processing models (*.model *.MODEL)')))
343+
filename, selected_filter = unicode(QFileDialog.getOpenFileName(self,
344+
self.tr('Open Model'), ModelerUtils.modelsFolders()[0],
345+
self.tr('Processing models (*.model *.MODEL)')))
346346
if filename:
347347
try:
348348
alg = ModelerAlgorithm.fromFile(filename)

‎python/plugins/processing/script/AddScriptFromFileAction.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ def getIcon(self):
5252
def execute(self):
5353
settings = QSettings()
5454
lastDir = settings.value('Processing/lastScriptsDir', '')
55-
filename = QFileDialog.getOpenFileName(self.toolbox,
56-
self.tr('Script files', 'AddScriptFromFileAction'), lastDir,
57-
self.tr('Script files (*.py *.PY)', 'AddScriptFromFileAction'))
55+
filename, selected_filter = QFileDialog.getOpenFileName(self.toolbox,
56+
self.tr('Script files', 'AddScriptFromFileAction'), lastDir,
57+
self.tr('Script files (*.py *.PY)', 'AddScriptFromFileAction'))
5858
if filename:
5959
try:
6060
settings.setValue('Processing/lastScriptsDir',

6 commit comments

Comments
 (6)

arnaud-morvan commented on Sep 17, 2016

@arnaud-morvan
Contributor

@volaya @nyalldawson
Seems that we are already broken with Qt4.
Does this means that I should also propose not compatible Qt4 code to fix bugs with Qt5 when needed in processing plugin ?

nyalldawson commented on Sep 17, 2016

@nyalldawson
CollaboratorAuthor

@arnaud-morvan I'd say yes, unless they break the Travis tests

arnaud-morvan commented on Sep 18, 2016

@arnaud-morvan
Contributor

This (file, filter = QFileDialog.getOpenFileName) seems not need for me on Ubuntu 16.04 with Qt5.
Not documented in Qt5.7 API.
Do you have met some errors with another distribution ?
Is is possible to revert ? As we could keep working processing on top of master with python2, waiting for compatibility with Python3.

nyalldawson commented on Sep 18, 2016

@nyalldawson
CollaboratorAuthor

It's a pyqt5 change, not qt 5 itself. See http://pyqt.sourceforge.net/Docs/PyQt5/pyqt4_differences.html#qfiledialog

I hit the error using console on 16.04, so not sure why it's not triggered for you. In any case the only reason we are still keeping qt4 compatibility in master is for the handful of tests which aren't passing in qt5. I'm hoping to fix the server based tests this week, which leaves just the qvariant rounding issues. As soon as these are fixed qt5 will be mandatory.

In the meantime I'd suggest everyone using master should be on qt5 anyway, to help find and fix bugs. Use master_2 if you particularly need qt4 compatibility.

arnaud-morvan commented on Sep 18, 2016

@arnaud-morvan
Contributor

I understand that qgis core plugin should be converted to python 3 ASAP. Just ?
@volaya : difficult to backport to master_2 after that.

nyalldawson commented on Sep 18, 2016

@nyalldawson
CollaboratorAuthor

Yeah... Backporting is a nightmare with all the changes and different branches, we're all suffering because of that. But working toward 3.0 should be our #1 priority now.

Please sign in to comment.