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_())