最近学习pyqt5,做一个视频播放器,网上找了很多资料都没有关于python方面的视频进度条拖动点击的方法,几乎都是Qt的。对相关资料的查阅,发现开发过程其实差不多,为此做一下相关的总结。

一、UI的设计

UI设计就不多说了,可以使用Designer大概画一个。

ui.py

class Ui_MainWindow(QMainWindow):def __init__(self):super(Ui_MainWindow, self).__init__()self.ui_init()def ui_init(self):self.resize(320, 250)self.main_widget = QWidget()  # 创建窗口主部件self.main_widget.setObjectName("main_widget")self.main_layout = QGridLayout()  # 创建主部件的网格布局self.main_widget.setLayout(self.main_layout)  # 设置窗口主部件布局为网格布局self.centralwidget = QWidget()self.centralwidget.setObjectName("centralwidget")  # 设置核心部件self.main_layout.addWidget(self.centralwidget)self.setCentralWidget(self.main_widget)  # 设置中心窗口setCentralWidgetself.vbox = QVBoxLayout(self.centralwidget)self.setObjectName("vbox")self.topUi()self.playUi()self.barUi()self.bottomUi()self.retranslateUi()self.show()def topUi(self):self.top_btn = QPushButton()self.top_btn.setMaximumSize(QSize(200, 16777215))self.setObjectName("top_btn")self.top_label = QLabel()self.top_label.setMaximumSize(QSize(16777215, 10))self.top_label.setObjectName("top_label")self.top_hbox = QHBoxLayout()self.top_hbox.setObjectName("top_hbox")self.top_hbox.addWidget(self.top_btn)self.top_hbox.addWidget(self.top_label)self.vbox.addLayout(self.top_hbox)def playUi(self):self.groupBox = QGroupBox()self.groupBox.setObjectName("groupBox")self.gridLayout = QGridLayout(self.groupBox)self.setObjectName("gridLayout")# myVideoWidget重写QVideoWidget ,实现双击视频最大化self.widget = myVideoWidget()self.widget.setMaximumSize(QSize(16777215, 16777215))self.widget.setObjectName("widget")self.label = QLabel(self)self.label.setMaximumSize(QSize(16777215, 16777215))self.gridLayout.addWidget(self.label, 0, 0, 1, 1)self.vbox.addWidget(self.groupBox)def barUi(self):self.bar_hbox = QHBoxLayout()self.bar_hbox.setObjectName("bar_hbox")# CustomSlider 重写QSlider方法,实现拖动点击self.bar_slider = CustomSlider()self.bar_slider.setEnabled(False)   # 禁用self.bar_slider.setOrientation(Qt.Horizontal)self.bar_slider.setObjectName("bar_slider")self.bar_label = QLabel(self)self.bar_label.setMaximumSize(QSize(50, 10))self.bar_label.setObjectName("bar_label")self.bar_hbox.addWidget(self.bar_slider)self.bar_hbox.addWidget(self.bar_label)self.vbox.addLayout(self.bar_hbox)def bottomUi(self):self.bottom_hbox = QHBoxLayout()self.bottom_hbox.setObjectName("bottom_hbox")self.stop_btn = QPushButton()self.stop_btn.setObjectName("stop_btn")self.end_btn = QPushButton()self.end_btn.setObjectName("end_btn")spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)self.bottom_hbox.addItem(spacerItem)self.bottom_hbox.addWidget(self.stop_btn)self.bottom_hbox.addItem(spacerItem)self.bottom_hbox.addWidget(self.end_btn)self.bottom_hbox.addItem(spacerItem)self.vbox.addLayout(self.bottom_hbox)def retranslateUi(self):_translate = QCoreApplication.translate # QCoreApplication会构建出当前线程需要的事件驱动器self.setWindowTitle(_translate("main_widget", "播放器   开发者: hp"))self.top_btn.setText(_translate("main_widget", "打开文件"))self.top_label.setText(_translate("main_widget", ""))self.groupBox.setTitle(_translate("main_widget", "预览"))self.label.setText(_translate("main_widget", "Waiting for video..."))self.bar_label.setText(_translate("main_widget", "00:00:00"))self.stop_btn.setText(_translate("main_widget", "暂停"))self.end_btn.setText(_translate("main_widget", "结束"))

二、相关按钮的方法(继承UI)

相关方法我主要讲述播放视频与滑动块的点击滑动等相关方法,如有错误请及时指出,第一次在csdn写博客,若写的不足,请尽量包涵。

class MainFunction(Ui_MainWindow):def __init__(self):super(MainFunction, self).__init__()self.play_flag = False  # 播放暂停的标志self.videoFullScreen = False # 判断当前widget是否全屏self.timer = QTimer()      # 定义定时器self.maxValue = 1000       # 设置进度条的最大值self.trigger()             # 触发方法

触发方法的相关函数

    def trigger(self):# 定义playerself.player = QMediaPlayer()self.player.setVideoOutput(self.widget)self.top_btn.clicked.connect(self.openVideoFile)self.stop_btn.clicked.connect(self.playVideo)self.end_btn.clicked.connect(self.stopVideo)self.bar_slider.sliderMoved.connect(self.slider_progress_moved)self.bar_slider.sliderReleased.connect(self.slider_progress_released)self.bar_slider.customSliderClicked.connect(self.slider_progress_clicked)

播放视频使用的是QMediaPlayer

一开始采用positionChanged信号来驱动,但是发现,QSlider两个信号槽互相修改,容易出现冲突,导出程序异常,所以才去定时器QTimer修改Slider。

打开文件

def openVideoFile(self):self.player.setMedia(QMediaContent(QFileDialog.getOpenFileUrl()[0]))  # 选取视频文件self.gridLayout.addWidget(self.widget, 0, 0, 1, 1)self.bar_slider.setEnabled(True)self.bar_slider.setRange(0,self.maxValue)self.player.play()  # 播放视频self.FLAG_PLAY = Trueself.timer.setInterval(1000)self.timer.start()self.timer.timeout.connect(self.onTimerOut)

onTimerOut方法 调节进度条播放进度与显示播放时长

    def onTimerOut(self):self.bar_slider.setValue(round(self.player.position()*self.maxValue/self.player.duration()))m, s = divmod(self.player.position() / 1000, 60)h, m = divmod(m, 60)self.bar_label.setText("%02d:%02d:%02d" % (h, m, s))self.widget.doubleClickedItem.connect(self.videoDoubleClicked)

重写 QSlider 控制 进度条拖动点击视频播放的操作

继承父类QSlider,重写mousePressEvent(按键释放)

class CustomSlider(QSlider):customSliderClicked = pyqtSignal(str)def __init__(self,parent=None):super(QSlider, self).__init__(parent)

继承父类的mousePressEvent方法,防止影响拖动操作

def mousePressEvent(self,QMouseEvent):super().mousePressEvent(QMouseEvent)    pos = QMouseEvent.pos().x() / self.width()self.setValue(round(pos*(self.maximum()-self.minimum())+self.minimum()))self.customSliderClicked.emit("mouse Press")

上面UI设计那已经替换了QSlider的方法为CustomSlider

对点击和拖动滑动块触发的方法

self.bar_slider.sliderMoved.connect(self.slider_progress_moved)
self.bar_slider.sliderReleased.connect(self.slider_progress_released)
self.bar_slider.customSliderClicked.connect(self.slider_progress_clicked)

sliderMoved(用户拖动滑块时触发)

    def slider_progress_moved(self):self.timer.stop()self.player.setPosition(round(self.bar_slider.value()*self.player.duration()/self.maxValue))

sliderReleased(用户释放滑块时触发)

    def slider_progress_released(self):self.timer.start()

customSliderClicked(自定方法,实现单击跳转至任意位置)

    def slider_progress_clicked(self):self.player.setPosition(round(self.bar_slider.value() * self.player.duration() / self.maxValue))

PyQt5 --- 进度条拖动点击视频播放相关推荐

  1. 【OpenCV+Qt】实现简易视频播放器——支持进度条拖动

    OpenCV实现视频播放器,其思路大致就是在线程中使用OpenCV中的VideoCapture循环读取本地视频的每一帧Mat,然后发送到界面转换成QImage进行显示,而进度条拖动则用到了VideoC ...

  2. 简单的进度条拖动效果及拖拽改变层大小

    业务需求 价格区间的  进度条拖动初级demo 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset=&qu ...

  3. 断点续传(视频进度条拖动以及flv.js需要断点续传)

    目前遇到2种场景需要用到断点续传 视频进度条无法正常拖动,或拖动视频未发生变化,F12请求头中可以看到"Range". 使用B站开源组件flv.js只可以播放3分钟视频,想要解决就 ...

  4. css拖动音乐进度条,利用CSS3实现3D滑块进度条拖动动画特效

    特效描述:利用CSS3实现 3D滑块 进度条拖动 动画特效.利用CSS3实现3D滑块进度条拖动动画特效 代码结构 1. HTML代码 Scalable 3D Range Sliders Simple ...

  5. 使用python加PyQt5,利用QMediaPlayer写一个简易的音乐播放器(进度条拖动,音量改变,播放停止切换,歌曲列表))

    当你学习了python之后,总想着利用它去做些什么,无论是制作小工具还是小游戏,都是一种锻炼. 那么,利用python加上PyQt5写一个简单的音乐播放器,可能会是一个有趣的体验. 下面我会分享一下如 ...

  6. 微信小程序 - 音频播放进度条和点击拖动的控制,支持自定义音乐播放控件样式布局(wx.createAudioContext)解决各种 InnerAudioContext.onTimeUpdate不执行

    前言 网上有很多关于 InnerAudioContext.onTimeUpdate 不执行.失效的问题,都导致播放进度条无法做了,本文完美解决. 本文实现了 自定义播放音频控件样式,且支持播放进度条显 ...

  7. 【Python笔记】pyqt5进度条-多线程图像分块处理防止窗体卡顿

    目录 主要功能 环境配置 实现过程 1.设计ui 主界面 弹出框 窗体文件 2.主体实现 打开文件 计算函数 代码附录 title.ui titleok.ui title.py titleok.py ...

  8. vue+vue-video-player进度条拖动及断续播放

    vue-video-player是一款视频播放插件,具体怎么引入vue-video-player 直接点进去有详细的介绍. 项目中视频可以正常播放,但是不能拖动进度条,拖动进度条就会从头开始,解决办法 ...

  9. 网易云项目播放组件中的进度条拖动bug(elementUI)

    因遇到的bug相同,此处部分参考引用了以下文章:vue+element制作音乐播放器播放进度条bug(鼠标拖拽slider滑块滑动到指定位置无效)_hhhhhhhssss的博客-CSDN博客_vue音 ...

最新文章

  1. 【C#】第3章学习要点(三)--常用类和结构的用法
  2. if python 判断函数返回值_Python函数的返回值和作用域
  3. flask mysql项目模板渲染_21. Flask 模板 - 宏、继承、包含
  4. 修炼Python基础篇-set学习
  5. win11没有hyper-v
  6. 转载:技术大停滞——范式春梦中的地球工业文明3:范式春梦外的阴影
  7. CentOS7.6的详细安装步骤
  8. 最简单明了的QT服务器搭建
  9. matlab计算胎心率,基于盲分离的胎心音心率检测算法与实现
  10. SQL查询学生表中每课大于85分的同学名称
  11. os.path.dirname用法
  12. ECG信号三大主要噪声-基线漂移,工频干扰,肌电干扰
  13. 计算机谣言之网线的做法
  14. 李开复写给中国大学生的七封信【3/7】
  15. 阿里云 CentOS 7安装 Zimbra-8.8.15开源邮件系统
  16. 基于SSM开发超市会员管理系统
  17. JavaScript第五天
  18. 融合AI技术的视频监控,为行业带来了哪些创新和突破?
  19. Mac OS平台开源的压缩解压缩软件——keka
  20. 考研英语文字材料大作文(议论文)

热门文章

  1. Mac无法连接wifi,重置wifi模块
  2. msp430中如何连续对位进行取反_如何选择护膝的尺码,手把手教你
  3. 天津大学计算机专业考研考什么,天津大学计算机专业考研难吗
  4. word无法打开请去应用商店_抖音去水印 | HTTP Catcher方法全解析
  5. 【电路补习笔记】8、稳压电路 —— 线性电源及LDO
  6. 电源设计基础笔记:DC-DC与LDO电路
  7. 单片机程序跑飞的原因
  8. 【Vue系列】Vue3.0知识点汇总整理
  9. 数学有什么用处?看完后恍然大悟!
  10. 记一次Linux服务器 误删数据的恢复操作