select_list_dialog.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. '''
  2. Boite de dialogue qui prend une liste de strings en entrée,
  3. permet d'en selectionner une ou plusieurs,
  4. et retourne une liste des strings selectionnées
  5. > utilisée par le script qgis_sync_compactage
  6. @author: olivier.massot, mai 2018
  7. '''
  8. import sys
  9. from PyQt5 import uic
  10. from PyQt5.Qt import QApplication, QMessageBox, QTableWidgetItem, \
  11. Qt, QDialog
  12. from path import Path
  13. Ui_window, _ = uic.loadUiType(Path(__file__).parent / 'select_list_dialog.ui')
  14. def exec_(*args, **kwargs):
  15. _ = QApplication(sys.argv)
  16. SYS_HOOK = sys.excepthook
  17. def error_handler(typ, value, trace):
  18. while QApplication.overrideCursor():
  19. QApplication.restoreOverrideCursor()
  20. QMessageBox.critical(dlg, typ.__name__, "{}".format(value))
  21. SYS_HOOK(typ, value, trace)
  22. sys.excepthook = error_handler
  23. dlg = SelectListDialog(*args, **kwargs)
  24. dlg.show()
  25. r = dlg.exec_()
  26. if r:
  27. return dlg.selection()
  28. else:
  29. return []
  30. class SelectListDialog(QDialog):
  31. def __init__(self, input_list, modifier=lambda x: x, title="Sélectionner les lignes"):
  32. super (SelectListDialog, self).__init__()
  33. self.input_list = input_list
  34. self.modifier = modifier
  35. self.title = title
  36. self.createWidgets()
  37. def createWidgets(self):
  38. self.ui = Ui_window()
  39. self.ui.setupUi(self)
  40. self.setWindowModality(Qt.ApplicationModal)
  41. self.ui.btn_ok.clicked.connect(self.ok)
  42. self.ui.lbl_title.setText(self.title)
  43. index = 0
  44. for item in self.input_list:
  45. self.ui.tbl_selection.insertRow(index)
  46. self.ui.tbl_selection.setItem(index, 0, QTableWidgetItem(str(self.modifier(item))))
  47. index += 1
  48. self.ui.tbl_selection.sortItems(0, Qt.AscendingOrder)
  49. def selection(self):
  50. output_list = []
  51. for model_index in self.ui.tbl_selection.selectedIndexes():
  52. output_list.append(self.input_list[model_index.row()])
  53. return output_list
  54. def ok(self):
  55. self.done(1)
  56. if __name__ == "__main__":
  57. selection = exec_(["1", "2", "3"])
  58. print(selection)