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。我已经实现了一个停止滚动的选项。 :)
我在我的图库中创建了一个 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。我已经实现了一个停止滚动的选项。 :)