插个题外话,因为这个代码写了有段时间了,加上年龄大了记忆不好,我也没有系统的学习python,纯依靠自己的一些经验来边写边调试,有些知识点有的也忘记了,通过写这个博客,我边写边学习,有时候会扩展了插入一些知识点,请大家理解。接下来分享自定义的QLabel控件,它作为播放器的图片展示窗口。继承自qfluentwidgets的 BodyLabel组件。 其中有些代码我注释掉了,也是在编写过程中逐渐优化的结果。思路:
1、创建一个信号槽函数:setImage(self, image: QImage),此处我在函数前面加了一个类似Java注解,是Python3.0之后加入新特性Decorators,大家可以搜一下原理和使用方式,我这里使用它没什么意义。我只是标注一下函数为信号槽函数,方便我记忆。
2、既然有信号槽函数,肯定有一个信号来触发这个函数的执行,并传递进来信号数据,以便函数进行操作。这个函数是接收信号传来的QImage数据,用于在QLabel中显示。
3、先介绍一下QPixmap类,它用于绘图设备的图像显示,它可以作为一个QPainterDevice对象,也可以加载到一个控件中,通常是标签或者按钮,用于在标签或按钮上显示图像。他可以读取的图像文件类型有BMP,GIF,JPG等。代码中将使用它将QImage对象转换为QPixmap对象,
然后使用resize_image方法设置图片的缩放,并返回一个调整后的QPixmap对象,并设置到QLabel中。
# 使用scaled方法把 QPixmap的分辨率设置为QLabel的大小
# KeepAspectRatio 可以保留宽高比
'''
Qt::KeepAspectRatio是一个枚举值,用于指定图像的缩放行为。
设置Qt::KeepAspectRatio属性后,图像将按比例缩放以适应目标矩形,并保持其长宽比。如果目标矩形的宽高比与图像的宽高比不一致,则图像的一部分会被剪裁掉。
Qt::SmoothTransformation是一个标志,用于指定图像的平滑变换行为。当进行图像缩放或旋转等变换时,
设置Qt::SmoothTransformation标志可以使图像显示更加平滑,减少锯齿状边缘的出现。
'''
def resize_image(self,pixmap:QPixmap, new_width, new_height):
resized_pixmap = pixmap.scaled(new_width, new_height, Qt.KeepAspectRatio, Qt.SmoothTransformation)
return resized_pixmap
from PySide6 import QtCore, QtGui, QtWidgets
from PySide6.QtCore import QSize,QPoint,Qt
from PySide6.QtGui import QImage, QResizeEvent,QPixmap
from qfluentwidgets import BodyLabel
'''
自定义一个标签,用于播放视频中的图片
'''
class PlayStreaming(BodyLabel):
# 定义一个信号,用于发送QLabel尺寸信息给线程
# reSize = QtCore.Signal(QtCore.QSize)
def __init__(self, parent):
super(PlayStreaming, self).__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("Image")
self.image_rate = None #无用
self.pix_map =None
'''
定义一个槽函数,用于接收线程里传递过来的图片对象
'''
@QtCore.Slot(QImage)
def setImage(self, image: QImage):
try:
self.pix_map = QtGui.QPixmap.fromImage(image)
# self.image_rate = self.pix_map.width() / self.pix_map.height()
self.pix_map=self.resize_image(self.pix_map,self.size().width(),self.size().height())
self.setPixmap(self.pix_map)
except:
pass
'''
Qt::KeepAspectRatio是一个枚举值,用于指定图像的缩放行为。
设置Qt::KeepAspectRatio属性后,图像将按比例缩放以适应目标矩形,并保持其长宽比。如果目标矩形的宽高比与图像的宽高比不一致,则图像的一部分会被剪裁掉。
Qt::SmoothTransformation是一个标志,用于指定图像的平滑变换行为。当进行图像缩放或旋转等变换时,
设置Qt::SmoothTransformation标志可以使图像显示更加平滑,减少锯齿状边缘的出现。
'''
def resize_image(self,pixmap:QPixmap, new_width, new_height):
resized_pixmap = pixmap.scaled(new_width, new_height, Qt.KeepAspectRatio, Qt.SmoothTransformation)
return resized_pixmap
# # 重载大小改变事件
# def resizeEvent(self, event: QResizeEvent):
# super().resizeEvent(event)
# def compute_size(self):
# if self.image_rate is not None:
# w = self.size().width()
# h = self.size().height()
# scale_w = int(h * self.image_rate)
# if scale_w <= w:
# self.resize(QSize(scale_w, h))
# self.setProperty("pos", QPoint(int((w - scale_w) / 2), 0))
# else:
# scale_h = int(w / self.image_rate)
# self.resize(QSize(w, scale_h))
# self.setProperty("pos", QPoint(0, int((h - scale_h) / 2)))
# else:
# print('设置标签大小')
# self.resize(self.size())
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.acceptProposedAction()
def dropEvent(self, event):
for url in event.mimeData().urls():
file_path = url.toLocalFile()
print('File Path', file_path)
# def resizeEvent(self, event):
# super().resizeEvent(event)
# self.compute_size()