QScrollArea 中的自动滚动器?

Auto-scroller in QScrollArea?

我在我的图库中创建了一个 AutoScroller,但似乎有一个错误不断加快滚动速度,这使得速度旋转框非常不准确。

我的自动滚动想法是使用 QTimer

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

class Main(object):
    def setupUI(self, Project):

Project = QWidget() Assigned from the outer scope and referenced

        Project.setFixedSize(QSize(900, 400))
        self.mainScroll = QScrollArea(Project)
        self.mainScroll.setGeometry(QRect(80, 0, 740, 400))
        self.mainScrollWidget = QWidget()
        self.layout = QVBoxLayout(self.mainScrollWidget)
        self.layout.addStretch()
        self.layout.setGeometry(
            QRect(0, 0, self.mainScroll.width(), self.mainScroll.height()))
        self.mainScroll.setWidget(self.mainScrollWidget)

        self.checkBox = QCheckBox("Auto-Scroll", Project)
        self.checkBox.setGeometry(QRect(0, 0, 80, 30))
        self.checkBox.toggled.connect(lambda: self.StartTimer(Project))

        self.PX_PER_TIME = 1
        self.Speed = 10

        for i in range(200):
            MainWidget = QWidget()
            label = QLabel("LABEL NO_%s" % str(i), MainWidget)
            label.adjustSize()
            self.layout.setSizeConstraint(QLayout.SetFixedSize)
            self.layout.addStretch(1)
            self.layout.addWidget(MainWidget)

    def ScrollDown(self):
        vScrollBar = self.mainScroll.verticalScrollBar()
        vScrollBar.setValue(vScrollBar.value() + self.PX_PER_TIME)

    def StartTimer(self, Project):
        if self.checkBox.isChecked():
            self.timeleft = self.Speed
            qTimer = QTimer(Project)
            qTimer.timeout.connect(self.TimerTimout)
            qTimer.start(1)
            self.ScrollDown()
        else:
            if type(qTimer) != None:
                qTimer.stop()
                self.timeleft = self.Speed

    def TimerTimout(self):
        if self.timeleft > 0:
            self.timeleft -= 1
        if self.timeleft == 0:
            self.timeleft = self.Speed
            self.ScrollDown()

编辑

这应该重现我的问题,它有点解释了解决方案的类型,我想要完成的是在 QCheckBox 被禁用后完全停止 QTimer,并将所有变量重新分配到它们的基本状态并停止滚动条滚动。

这是我的答案。我已经实施了一个从您的问题示例顶部构建的简单示例。我修复了一些语法错误并删除了一些不必要的代码。希望对你有所帮助。

from PyQt5 import QtCore, QtGui, QtWidgets


class Main(QtWidgets.QWidget):
    def __init__(self):
        super(Main, self).__init__()

        self.speed = QtWidgets.QSpinBox(self)
        self.speed.setValue(10)

        self.autoscroll = QtWidgets.QCheckBox(self)

        self.imageLabel = QtWidgets.QLabel()
        self.image = QtGui.QImage("test.jpg")
        self.imageLabel.setPixmap(QtGui.QPixmap.fromImage(self.image))

        self.ScrollArea = QtWidgets.QScrollArea()
        self.ScrollArea.setBackgroundRole(QtGui.QPalette.Dark)
        self.ScrollArea.setWidget(self.imageLabel)

        self.autoscroll.toggled.connect(self.toggleTimer)
        self.layout = QtWidgets.QVBoxLayout()
        self.layout.addWidget(self.speed)
        self.layout.addWidget(self.autoscroll)
        self.layout.addWidget(self.ScrollArea)
        self.setLayout(self.layout)

        self.qTimer = QtCore.QTimer(self)
        self.qTimer.timeout.connect(self.timerTimout)

    def toggleTimer(self):
        if self.qTimer.isActive():
            self.stopTimer()
        else:
            self.startTimer()

    def stopTimer(self):
        self.qTimer.stop()

    def startTimer(self):
        self.qTimer.start(1)

    def timerTimout(self):
        self.scrollDown()

    def scrollDown(self):
        scrollBar = self.ScrollArea.verticalScrollBar()
        scrollBar.setValue(scrollBar.value() + self.speed.value())


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    widget = Main()
    widget.show()
    sys.exit(app.exec_())

P.S。我已经实现了一个停止滚动的选项。 :)