pyqt5图片控件,pyqt5实现多张图片展示
在PyQt中实现照片查看器有很多种方法。本文将使用QGraphicsView类来实现图片浏览器的制作。感兴趣的朋友可以和边肖一起尝试一下。
00-1010前言实施测试
目录
在PyQt中实现照片查看器有很多种方法。最简单的方法就是重写QWidget的paintEvent()、mouseMoveEvent等事件。但是,如果您想要为图像添加更多形状,则需要在对图像执行仿射变换(如缩放和旋转)时变换这些形状。虽然不难,但是从零开始实现这些变换和形状,还是挺烦的。幸运的是,Qt提供了一个图形化的视图框架。关于这个框架的基本使用,请参见PyQt5中图形视图框架的深入理解。让我们言归正传。
前言
基本照片浏览器应具备以下功能:
当窗口尺寸小于图像时,加载图像缩放图像允许拖动图像。加载图像可以通过QGraphicsPixmapItem解决,缩放图像可以通过QGraphicsView的scale(sx,sy)解决,移动图像只需要将QGraphicsView的dragMode设置为QGraphicsView即可。ScrollHandDrag因为经常使用鼠标滚轮来缩放图像,所以还需要重写QGraphicsView的以下wheelEvent。
实际上,由于窗口的缩放,视窗大小会发生变化,仍然有一些小细节需要处理。具体代码如下:
#编码:utf-8
导入系统
来自PyQt5。QtCore导入QRect,QRectF,QSize,Qt
来自PyQt5。QtGui导入QPainter、QPixmap、QWheelEvent
来自PyQt5。QtWidgets导入(QApplication,QGraphicsItem,QGraphicsPixmapItem,
QGraphicsScene,QGraphicsView)
类别image viewer(QGraphicsView):
图片查看器
def __init__(self,parent=None):
超级()。__init__(parent=parent)
self.zoomInTimes=0
self.maxZoomInTimes=22
#创造一个场景
self . graphics scene=qgraphics scene()
#图片
self . pixmap=qpixmap(r d : hzz picture 硝酸盐硝酸盐(2)。jpg’)
self . pixmapitem=QGraphicsPixmapItem(self . pixmap)
self . displayed imagesize=QSize(0,0)
#初始化小部件
自我。__initWidget()
def __initWidget(self):
初始化小工具
self.resize(1200,900)
#隐藏滚动条
self . setverticalscrollbarpolicy(Qt。ScrollBarAlwaysOff)
self . sethorizontalscrollbarpolicy(Qt。ScrollBarAlwaysOff)
#以鼠标位置为锚点进行缩放
self . settransformationanchor(self。鼠标下的锚点)
#平滑缩放
self.pixmapItem.setTransfor
mationMode(Qt.SmoothTransformation)
self.setRenderHints(QPainter.Antialiasing
QPainter.SmoothPixmapTransform)
# 设置场景
self.graphicsScene.addItem(self.pixmapItem)
self.setScene(self.graphicsScene)
def wheelEvent(self, e: QWheelEvent):
""" 滚动鼠标滚轮缩放图片 """
if e.angleDelta().y() > 0:
self.zoomIn()
else:
self.zoomOut()
def resizeEvent(self, e):
""" 缩放图片 """
super().resizeEvent(e)
if self.zoomInTimes > 0:
return
# 调整图片大小
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):
""" 设置显示的图片 """
self.resetTransform()
# 刷新图片
self.pixmap = QPixmap(imagePath)
self.pixmapItem.setPixmap(self.pixmap)
# 调整图片大小
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):
""" 根据图片的尺寸决定是否启动拖拽功能 """
v = self.verticalScrollBar().maximum() > 0
h = self.horizontalScrollBar().maximum() > 0
return v or h
def __setDragEnabled(self, isEnabled: bool):
""" 设置拖拽是否启动 """
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):
""" 缩放场景使其适应窗口大小 """
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()
# 实际显示的图像宽度
w = self.displayedImageSize.width()*1.1**self.zoomInTimes
h = self.displayedImageSize.height()*1.1**self.zoomInTimes
if pw > self.width() or ph > self.height():
# 在窗口尺寸小于原始图像时禁止继续缩小图像比窗口还小
if w <= self.width() and h <= self.height():
self.fitInView(self.pixmapItem)
else:
self.scale(1/1.1, 1/1.1)
else:
# 在窗口尺寸大于图像时不允许缩小的比原始图像小
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_())
测试
来看一下实际的使用效果:
到此这篇关于Python+PyQt5制作一个图片查看器的文章就介绍到这了,更多相关PyQt5图片查看器内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。