python+ffpyplayer制作的视频播放程序第七篇

插个题外话,因为这个代码写了有段时间了,加上年龄大了记忆不好,我也没有系统的学习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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wzffzw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值