PyQt5实时QSlider

2024-09-24 22:30:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我尝试使用setTickPosition(QSlider::TickPosition位置),但它没有改变任何东西。也许我没有使用好的函数

也许这段代码能帮你看看我的处境

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_())

Tags: fromimportselfdefconnectpositionpyqt5slider
1条回答
网友
1楼 · 发布于 2024-09-24 22:30:24

滴答声与此无关,滑块也与此无关

问题是QMediaPlayer用于通知的默认间隔是1000ms

如果你想改变这一点,可以使用^{},间隔合适毫秒(我建议不要使用小于100-150ms的值)

相关问题 更多 >