PyQt5 - QSlider 实时

问题描述

我正在创建一个软件来读取和处理视频。我刚刚开始这个项目,但我已经遇到了问题。我想创建一个实时反应的滑块。目前,滑块仅在几秒钟内移动。 我的滑块就是这样设置的。

    self.slider = QSlider(Qt.Horizontal)
    self.slider.sliderMoved.connect(self.set_position)
    
    def set_position(self,position):
       self.mediaPlayer.setPosition(position)

我尝试使用 setTickPosition(QSlider::TickPosition position) 但它没有改变任何东西。可能是我没用好功能

也许这段代码可以帮助你看到我卡在哪里

from PyQt5.QtWidgets import QWidget,QApplication,QSlider,QHBoxLayout,qstyle,QFileDialog,QPushButton,QVBoxLayout
from PyQt5.QtMultimedia import QMediaPlayer,QMediaContent
from PyQt5.QtGui import QIcon
from PyQt5.QtMultimediawidgets import QVideoWidget
from PyQt5.QtCore import Qt,QUrl
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()
        
        self.setwindowTitle("Slider tick settings")
        self.setGeometry(350,100,720,700)
        self.setwindowIcon(QIcon("icon.png"))

        self.init_ui()
        
        self.show()
        
    def init_ui(self):
        
        self.mediaPlayer = QMediaPlayer(None,QMediaPlayer.VideoSurface)
        
        VideoWidget = QVideoWidget()
        
        self.slider = QSlider(Qt.Horizontal)
        self.slider.sliderMoved.connect(self.set_position)
        
        self.playBtn = QPushButton("Play")
        self.openFile = QPushButton("Open File")
        self.playBtn.clicked.connect(self.play_video)
        self.openFile.clicked.connect(self.open_file)
        
        self.qhBox = QHBoxLayout()
        self.qvBox = QVBoxLayout()
        
        self.qhBox.addWidget(self.slider)
        self.qhBox.addWidget(self.openFile)
        self.qhBox.addWidget(self.playBtn)
        self.qvBox.addLayout(self.qhBox) 
        self.qvBox.addWidget(VideoWidget)
        self.setLayout(self.qvBox)
    
        self.mediaPlayer.setVideoOutput(VideoWidget)
        
        self.mediaPlayer.stateChanged.connect(self.mediastate_changed)
        self.mediaPlayer.positionChanged.connect(self.position_changed)
        self.mediaPlayer.durationChanged.connect(self.duration_changed)
        
    def set_position(self,position):
        self.mediaPlayer.setPosition(position)
    
    def mediastate_changed(self,state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playBtn.setIcon(self.style().standardIcon(qstyle.SP_MediaPause))
        else:
            self.playBtn.setIcon(self.style().standardIcon(qstyle.SP_MediaPlay))
    
    def open_file(self):
        filename,_ = QFileDialog.getopenFileName(self,"Open Video")
        if filename != '':
            self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(filename)))
            self.playBtn.setEnabled(True)
            #self.getRealFilename(filename)
            
    def position_changed(self,position):
        self.slider.setValue(position)
        
    def duration_changed(self,duration):
        self.slider.setRange(0,duration)
        
    def set_position(self,position):
        self.mediaPlayer.setPosition(position)
         
    def play_video(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState :
            self.mediaPlayer.pause()
        else :
            self.mediaPlayer.play()       
    
if __name__ == "__main__":
    app = QApplication(sys.argv)
    Window = Window()
    sys.exit(app.exec_())

解决方法

刻度与此无关,滑块也与此无关。

问题是 QMediaPlayer 用于通知的默认间隔是 1000 毫秒。

如果您想更改它,请使用具有 适当 毫秒间隔的 setNotifyInterval()(我建议不要使用小于 100-150 毫秒的值)。