簡體   English   中英

PyQt5:如何檢測QSlider是否拖到最后

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM