[英]PyQt5: How to detect if QSlider is dragged to the end
我想檢測用戶是否將 QSlider 手柄一直拖到最后。
我創建了一個視頻播放器,在 QLabel object 中顯示視頻幀。水平 QSlider object 跟蹤視頻 position,也可以拖動到 position 視頻。 如果視頻一直播放到最后,我希望視頻播放器做一件事;如果用戶將 slider 一直拖到最后,我希望視頻播放器做另一件事。
我嘗試檢測當 slider 到達末尾時鼠標按鈕是否被按下,但無法在下面的腳本中使用它。 是否有其他方法可以確定當用戶拖動 slider(按下鼠標按鈕)時是否到達 slider 的結尾,而不是視頻自行播放到結尾(未按下鼠標按鈕)?
from PyQt5 import QtCore, QtWidgets
import sys
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)
self.label = QtWidgets.QLabel()
self.label.setStyleSheet("border: 1px solid black")
self.slider = QtWidgets.QSlider()
self.slider.setOrientation(QtCore.Qt.Horizontal)
lay = QtWidgets.QVBoxLayout(central_widget)
#lay.addWidget(self.label)
lay.addWidget(self.slider)
self.resize(640, 480)
def mousePressEvent(self, event):
super().mousePressEvent(event)
self.label.setText('Pressed')
def mouseReleaseEvent(self, event):
super().mouseReleaseEvent(event)
self.label.setText('Released')
def sliderPressed(self, event):
super().sliderPressed(event)
self.label.setText('Pressed')
def sliderReleased(self, event):
super().sliderReleased(event)
self.label.setText('Released')
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
QSlider
class 繼承了QAbstractSlider ,它有一些信號和函數使得這個相對容易實現。 特別是, actionTriggered 信號提供細粒度的 slider 移動通知,這些通知獨立於任何編程值更改(即通過setValue
)。 這允許在值本身發生變化之前跟蹤所有鼠標和鍵盤的變化(通過拖動、滾輪滾動、箭頭/翻頁鍵等),這幾乎可以提供完全控制。 還有sliderDown 屬性,可用於識別拖動時按下鼠標的具體情況。
以下是基於您的示例的簡單演示:
from PyQt5 import QtCore, QtWidgets
import sys
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
central_widget = QtWidgets.QWidget()
self.setCentralWidget(central_widget)
self.label = QtWidgets.QLabel()
self.label.setStyleSheet("border: 1px solid black")
self.slider = QtWidgets.QSlider()
self.slider.setOrientation(QtCore.Qt.Horizontal)
self.slider.setRange(0, 10000)
self.slider.setSingleStep(50)
self.slider.setPageStep(500)
self.slider.actionTriggered.connect(self.handleSliderAction)
self.button = QtWidgets.QPushButton('Play')
self.button.clicked.connect(self.handlePlay)
lay = QtWidgets.QVBoxLayout(central_widget)
lay.addWidget(self.label)
lay.addWidget(self.slider)
lay.addWidget(self.button)
self.resize(640, 480)
self.timer = QtCore.QTimer()
self.timer.setInterval(10)
self.timer.timeout.connect(
lambda: self.slider.setValue(self.slider.value() + 1))
def handleSliderAction(self, action):
value = self.slider.sliderPosition()
if value == self.slider.maximum():
if self.slider.isSliderDown():
self.label.setText('slider: end (down)')
else:
self.label.setText('slider: end')
else:
self.label.setText(f'slider: {value}')
def handlePlay(self):
if self.timer.isActive():
self.timer.stop()
self.button.setText('Play')
else:
self.button.setText('Pause')
self.timer.start()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.