Source code for pymodaq_gui.plotting.image_viewer

from qtpy import QtCore, QtGui, QtWidgets


[docs] class Image_Viewer(QtWidgets.QGraphicsView): def __init__(self, parent): super(Image_Viewer, self).__init__(parent) self._zoom = 0 self._scene = QtWidgets.QGraphicsScene(self) self._image = QtWidgets.QGraphicsPixmapItem() self._scene.addItem(self._image) self.setScene(self._scene) self.setTransformationAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse) self.setResizeAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse) self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.setBackgroundBrush(QtGui.QBrush(QtGui.QColor(30, 30, 30))) self.setFrameShape(QtWidgets.QFrame.NoFrame)
[docs] def fitInView(self): rect = QtCore.QRectF(self._image.pixmap().rect()) if not rect.isNull(): unity = self.transform().mapRect(QtCore.QRectF(0, 0, 1, 1)) self.scale(1 / unity.width(), 1 / unity.height()) viewrect = self.viewport().rect() scenerect = self.transform().mapRect(rect) factor = min(viewrect.width() / scenerect.width(), viewrect.height() / scenerect.height()) self.scale(factor, factor) self.centerOn(rect.center()) self._zoom = 0
[docs] def setPhoto(self, pixmap=None): self._zoom = 0 if pixmap and not pixmap.isNull(): self.setDragMode(QtWidgets.QGraphicsView.ScrollHandDrag) self._image.setPixmap(pixmap) # self.fitInView() else: self.setDragMode(QtWidgets.QGraphicsView.NoDrag) self._image.setPixmap(QtGui.QPixmap())
[docs] def zoomFactor(self): return self._zoom
[docs] def wheelEvent(self, event): try: if not self._image.pixmap().isNull(): # delta=QtCore.QPoint() # delta.y if event.angleDelta().y() > 0: factor = 1.25 self._zoom += 1 else: factor = 0.8 self._zoom -= 1 if self._zoom > 0: self.scale(factor, factor) elif self._zoom == 0: self.fitInView() else: self._zoom = 0 except Exception as e: pass
[docs] class Window(QtWidgets.QWidget): def __init__(self): super(Window, self).__init__() self.viewer = Image_Viewer(self) self.edit = QtWidgets.QLineEdit(self) self.edit.setReadOnly(True) self.button = QtWidgets.QToolButton(self) self.button.setText('...') self.button.clicked.connect(self.handleOpen) layout = QtWidgets.QGridLayout(self) layout.addWidget(self.viewer, 0, 0, 1, 2) layout.addWidget(self.edit, 1, 0, 1, 1) layout.addWidget(self.button, 1, 1, 1, 1)
[docs] def handleOpen(self): path = QtWidgets.QFileDialog.getOpenFileName( self, 'Choose Image', self.edit.text()) path = path[0] if path: self.edit.setText(path) self.viewer.setPhoto(QtGui.QPixmap(path))
if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) window = Window() window.setGeometry(500, 300, 800, 600) window.show() sys.exit(app.exec_())