I’m trying to create a basic image viewer with just a few features.
- Can add/remove images
- Can move/drag images.
- Can rotate images
- Can scale images
I don’t know how to add control handles around a selected image so that I can change scale(not crop) of the image by moving those handles. Here is my code so far:
import sys
from PyQt5.QtWidgets import QGraphicsView, QGraphicsScene, QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QGraphicsPixmapItem, QGraphicsRectItem, QFileDialog, QSlider
from PyQt5.QtGui import QPixmap, QImage, QPen, QColor, QTransform
from PyQt5.QtCore import Qt, QRectF
class ImageViewer(QMainWindow):
def __init__(self):
super().__init__()
self.scene = QGraphicsScene()
self.view = QGraphicsView(self.scene)
self.view.setMouseTracking(True)
self.image_item = None
self.selection_rect = None
self.zoom_factor = 1.0
layout = QVBoxLayout()
layout.addWidget(self.view)
self.button_add_image = QPushButton("Add Image")
self.button_add_image.clicked.connect(self.add_image)
layout.addWidget(self.button_add_image)
self.slider_rotate = QSlider(Qt.Horizontal)
self.slider_rotate.setMinimum(0)
self.slider_rotate.setMaximum(360)
self.slider_rotate.setValue(0)
self.slider_rotate.setTickInterval(1)
self.slider_rotate.setTickPosition(QSlider.TicksBelow)
self.slider_rotate.valueChanged.connect(self.rotate_image)
layout.addWidget(self.slider_rotate)
widget = QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
def add_image(self):
file_path, _ = QFileDialog.getOpenFileName(self, "Open Image File", "", "Image Files (*.png *.jpg *.jpeg *.bmp)")
if file_path:
image = QImage(file_path)
pixmap = QPixmap.fromImage(image)
self.image_item = QGraphicsPixmapItem(pixmap)
self.scene.addItem(self.image_item)
def wheelEvent(self, event):
if event.modifiers() == Qt.ControlModifier:
delta = event.angleDelta().y() / 120
self.zoom_factor += delta * 0.1
self.view.resetTransform()
self.view.scale(self.zoom_factor, self.zoom_factor)
def mousePressEvent(self, event):
if self.image_item and self.image_item.isUnderMouse():
self.image_item.setFlag(QGraphicsPixmapItem.ItemIsMovable)
self.image_item.setFlag(QGraphicsPixmapItem.ItemIsSelectable)
def mouseReleaseEvent(self, event):
if self.image_item:
self.image_item.setFlag(QGraphicsPixmapItem.ItemIsMovable, False)
def rotate_image(self):
if self.image_item:
rotation = self.slider_rotate.value()
center = self.image_item.boundingRect().center()
transform = QTransform().translate(center.x(), center.y()).rotate(rotation).translate(-center.x(), -center.y())
self.image_item.setTransform(transform)
if self.selection_rect:
self.selection_rect.setTransform(transform)
if __name__ == '__main__':
app = QApplication(sys.argv)
viewer = ImageViewer()
viewer.show()
sys.exit(app.exec_())
Can anyone please help me with this.
Thanks.