简体   繁体   中英

PyQt5 - QSlider in real time

I'm creating a software to read and process videos. I just began this project but I already have an issue. I want to create a slider which reacts in real time. Currently, the slider only moves around very seconds. My slider is set up like that.

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

I tried to use setTickPosition(QSlider::TickPosition position) but it doesn't change anything. Maybe I'm not using the good function.

Maybe this code could help you to see where I stuck

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

Ticks have nothing to do with that, nor the slider.

The problem is the default interval that QMediaPlayer uses for notifications, which is 1000ms.

If you want to change that, use setNotifyInterval() with a proper millisecond interval (I suggest to not use values smaller than 100-150ms).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM