file_dialog_preview.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from qtpy import QtCore
  2. from qtpy import QtGui
  3. from qtpy import QtWidgets
  4. import json
  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(
  39. json.dumps(data, indent=4, sort_keys=False)
  40. )
  41. self.labelPreview.label.setAlignment(
  42. QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop
  43. )
  44. self.labelPreview.setHidden(False)
  45. else:
  46. pixmap = QtGui.QPixmap(path)
  47. if pixmap.isNull():
  48. self.labelPreview.clear()
  49. self.labelPreview.setHidden(True)
  50. else:
  51. self.labelPreview.setPixmap(
  52. pixmap.scaled(
  53. self.labelPreview.width() - 30,
  54. self.labelPreview.height() - 30,
  55. QtCore.Qt.KeepAspectRatio,
  56. QtCore.Qt.SmoothTransformation,
  57. )
  58. )
  59. self.labelPreview.label.setAlignment(QtCore.Qt.AlignCenter)
  60. self.labelPreview.setHidden(False)