file_dialog_preview.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import json
  2. from qtpy import QtCore
  3. from qtpy import QtGui
  4. from qtpy import QtWidgets
  5. class ScrollAreaPreview(QtWidgets.QScrollArea):
  6. def __init__(self, *args, **kwargs):
  7. super(ScrollAreaPreview, self).__init__(*args, **kwargs)
  8. self.setWidgetResizable(True)
  9. content = QtWidgets.QWidget(self)
  10. self.setWidget(content)
  11. lay = QtWidgets.QVBoxLayout(content)
  12. self.label = QtWidgets.QLabel(content)
  13. self.label.setWordWrap(True)
  14. lay.addWidget(self.label)
  15. def setText(self, text):
  16. self.label.setText(text)
  17. def setPixmap(self, pixmap):
  18. self.label.setPixmap(pixmap)
  19. def clear(self):
  20. self.label.clear()
  21. class FileDialogPreview(QtWidgets.QFileDialog):
  22. def __init__(self, *args, **kwargs):
  23. super(FileDialogPreview, self).__init__(*args, **kwargs)
  24. self.setOption(self.DontUseNativeDialog, True)
  25. self.labelPreview = ScrollAreaPreview(self)
  26. self.labelPreview.setFixedSize(300, 300)
  27. self.labelPreview.setHidden(True)
  28. box = QtWidgets.QVBoxLayout()
  29. box.addWidget(self.labelPreview)
  30. box.addStretch()
  31. self.setFixedSize(self.width() + 300, self.height())
  32. self.layout().addLayout(box, 1, 3, 1, 1)
  33. self.currentChanged.connect(self.onChange)
  34. def onChange(self, path):
  35. if path.lower().endswith(".json"):
  36. with open(path, "r") as f:
  37. data = json.load(f)
  38. self.labelPreview.setText(json.dumps(data, indent=4, sort_keys=False))
  39. self.labelPreview.label.setAlignment(
  40. QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop
  41. )
  42. self.labelPreview.setHidden(False)
  43. else:
  44. pixmap = QtGui.QPixmap(path)
  45. if pixmap.isNull():
  46. self.labelPreview.clear()
  47. self.labelPreview.setHidden(True)
  48. else:
  49. self.labelPreview.setPixmap(
  50. pixmap.scaled(
  51. self.labelPreview.width() - 30,
  52. self.labelPreview.height() - 30,
  53. QtCore.Qt.KeepAspectRatio,
  54. QtCore.Qt.SmoothTransformation,
  55. )
  56. )
  57. self.labelPreview.label.setAlignment(QtCore.Qt.AlignCenter)
  58. self.labelPreview.setHidden(False)