PyQt5显示图片一般是QLabel或者QGraphicsView两种。本文只介绍一下我使用QGraphicsView显示图片的经验。
GraphicsView框架介绍:GraphicsView
1、图片太大,QGraphicsView初始显示不全。如果先对图片resize,图片会严重失真,后面放大之后特别模糊。采用的方法是图片实例化为图元,对图元进行缩放,然后再添加到场景和视图中。
# 实例化QPixmap,加载图片
img1 = QPixmap()
img1 .load(r'D:\1.jpg')
# 或者opencv读取图片,直接加载图片内容
#img1 = QtGui.QImage(img1.data, img1.shape[1], img1.shape[0],QtGui.QImage.Format_RGBA8888)
#img1 = QPixmap(img1)
# scrollLableItem是自定义的图元类,继承自QGraphicsPixmapItem,是为了实现图片缩放和移动。
item1 = scrollLableItem(img1)
item1.setScale(self.scale)
#self.image1是GraphicsView的名字
self.image1.scene.addItem(item1)
2、代码要在不同的显示器上运行,self.scale的设置不能为常数。
首先在自己电脑上试验出一个scale_a,使图片能够完全显示或者达到想要的效果,然后令图片尺寸 * scale_a=显示器尺寸 * scale_b,求出scale_b。至于为什么,自己琢磨吧。最后的self.scale=显示器尺寸 * scale_b/图片尺寸。
比如我的图片是1280 * 640,显示器尺寸是1920 * 1080,试验出的scale_a是0.67,那么得出的scale_b就是0.44,最终的self.scale就是self.width * 0.44 / 1280。
# 获取显示器分辨率大小
self.screenRect = self.desktop.screenGeometry()
self.height = self.screenRect.height()
self.width = self.screenRect.width()
self.scale = float(self.width * 0.44 / 1280)
图片的完全显示效果就可以在运行不同显示器上了。
3、待解决。scrollLableItem继承自QGraphicsPixmapItem,重构了鼠标事件,能够实现图片的放缩,移动。但是图片放大之后出现了滚动条,缩小之后滚动条不消失,就有可能移动出画面,目前认为是scene大小的关系,难道要缩放之后就刷新scene吗?有大佬知道的话,还望不吝赐教!!