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