您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Python+PyQt5如何制作一個(gè)圖片查看器,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
一個(gè)最基本的照片查看器應(yīng)該具有以下功能:
載入圖像
縮放圖像
在窗口尺寸小于圖像時(shí)允許拖拽圖像
載入圖像可以使用 QGraphicsPixmapItem
來解決,縮放圖像使用 QGraphicsView
的 scale(sx, sy)
解決,移動(dòng)圖像只需將 QGraphicsView
的 dragMode
設(shè)置為 QGraphicsView.ScrollHandDrag
即可。因?yàn)槌3J褂檬髽?biāo)滾輪來縮放圖像,所以還需要重寫重寫以下 QGraphicsView
的 wheelEvent
。
實(shí)際上由于窗口的縮放導(dǎo)致視口大小變化,還有一些細(xì)枝末節(jié)需要處理。具體代碼如下:
# coding:utf-8 import sys from PyQt5.QtCore import QRect, QRectF, QSize, Qt from PyQt5.QtGui import QPainter, QPixmap, QWheelEvent from PyQt5.QtWidgets import (QApplication, QGraphicsItem, QGraphicsPixmapItem, QGraphicsScene, QGraphicsView) class ImageViewer(QGraphicsView): """ 圖片查看器 """ def __init__(self, parent=None): super().__init__(parent=parent) self.zoomInTimes = 0 self.maxZoomInTimes = 22 # 創(chuàng)建場(chǎng)景 self.graphicsScene = QGraphicsScene() # 圖片 self.pixmap = QPixmap(r'D:\hzz\圖片\硝子\硝子 (2).jpg') self.pixmapItem = QGraphicsPixmapItem(self.pixmap) self.displayedImageSize = QSize(0, 0) # 初始化小部件 self.__initWidget() def __initWidget(self): """ 初始化小部件 """ self.resize(1200, 900) # 隱藏滾動(dòng)條 self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # 以鼠標(biāo)所在位置為錨點(diǎn)進(jìn)行縮放 self.setTransformationAnchor(self.AnchorUnderMouse) # 平滑縮放 self.pixmapItem.setTransformationMode(Qt.SmoothTransformation) self.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform) # 設(shè)置場(chǎng)景 self.graphicsScene.addItem(self.pixmapItem) self.setScene(self.graphicsScene) def wheelEvent(self, e: QWheelEvent): """ 滾動(dòng)鼠標(biāo)滾輪縮放圖片 """ if e.angleDelta().y() > 0: self.zoomIn() else: self.zoomOut() def resizeEvent(self, e): """ 縮放圖片 """ super().resizeEvent(e) if self.zoomInTimes > 0: return # 調(diào)整圖片大小 ratio = self.__getScaleRatio() self.displayedImageSize = self.pixmap.size()*ratio if ratio < 1: self.fitInView(self.pixmapItem, Qt.KeepAspectRatio) else: self.resetTransform() def setImage(self, imagePath: str): """ 設(shè)置顯示的圖片 """ self.resetTransform() # 刷新圖片 self.pixmap = QPixmap(imagePath) self.pixmapItem.setPixmap(self.pixmap) # 調(diào)整圖片大小 self.setSceneRect(QRectF(self.pixmap.rect())) ratio = self.__getScaleRatio() self.displayedImageSize = self.pixmap.size()*ratio if ratio < 1: self.fitInView(self.pixmapItem, Qt.KeepAspectRatio) def resetTransform(self): """ 重置變換 """ super().resetTransform() self.zoomInTimes = 0 self.__setDragEnabled(False) def __isEnableDrag(self): """ 根據(jù)圖片的尺寸決定是否啟動(dòng)拖拽功能 """ v = self.verticalScrollBar().maximum() > 0 h = self.horizontalScrollBar().maximum() > 0 return v or h def __setDragEnabled(self, isEnabled: bool): """ 設(shè)置拖拽是否啟動(dòng) """ self.setDragMode( self.ScrollHandDrag if isEnabled else self.NoDrag) def __getScaleRatio(self): """ 獲取顯示的圖像和原始圖像的縮放比例 """ if self.pixmap.isNull(): return 1 pw = self.pixmap.width() ph = self.pixmap.height() rw = min(1, self.width()/pw) rh = min(1, self.height()/ph) return min(rw, rh) def fitInView(self, item: QGraphicsItem, mode=Qt.KeepAspectRatio): """ 縮放場(chǎng)景使其適應(yīng)窗口大小 """ super().fitInView(item, mode) self.displayedImageSize = self.__getScaleRatio()*self.pixmap.size() self.zoomInTimes = 0 def zoomIn(self, viewAnchor=QGraphicsView.AnchorUnderMouse): """ 放大圖像 """ if self.zoomInTimes == self.maxZoomInTimes: return self.setTransformationAnchor(viewAnchor) self.zoomInTimes += 1 self.scale(1.1, 1.1) self.__setDragEnabled(self.__isEnableDrag()) # 還原 anchor self.setTransformationAnchor(self.AnchorUnderMouse) def zoomOut(self, viewAnchor=QGraphicsView.AnchorUnderMouse): """ 縮小圖像 """ if self.zoomInTimes == 0 and not self.__isEnableDrag(): return self.setTransformationAnchor(viewAnchor) self.zoomInTimes -= 1 # 原始圖像的大小 pw = self.pixmap.width() ph = self.pixmap.height() # 實(shí)際顯示的圖像寬度 w = self.displayedImageSize.width()*1.1**self.zoomInTimes h = self.displayedImageSize.height()*1.1**self.zoomInTimes if pw > self.width() or ph > self.height(): # 在窗口尺寸小于原始圖像時(shí)禁止繼續(xù)縮小圖像比窗口還小 if w <= self.width() and h <= self.height(): self.fitInView(self.pixmapItem) else: self.scale(1/1.1, 1/1.1) else: # 在窗口尺寸大于圖像時(shí)不允許縮小的比原始圖像小 if w <= pw: self.resetTransform() else: self.scale(1/1.1, 1/1.1) self.__setDragEnabled(self.__isEnableDrag()) # 還原 anchor self.setTransformationAnchor(self.AnchorUnderMouse) if __name__ == '__main__': app = QApplication(sys.argv) w = ImageViewer() w.show() sys.exit(app.exec_())
來看一下實(shí)際的使用效果:
關(guān)于“Python+PyQt5如何制作一個(gè)圖片查看器”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。