首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQt4:使用QVariantAnimation在两个值之间动画

PyQt4:使用QVariantAnimation在两个值之间动画
EN

Stack Overflow用户
提问于 2017-10-26 18:43:38
回答 1查看 1.2K关注 0票数 3

我有一个自定义的进度条,当它从一个值变化到另一个值时,我想将它动画化。当我得到一个值时,我重新绘制表示进度条的矩形-所以我认为这应该像动画值本身和重新绘制每个更改一样简单。我一直在查看动画框架文档,我非常确信子类QVariantAnimation将满足我的需要--但是我找不到多少或者根本找不到Python示例,而且我有点迷路了。

这是我到目前为止的情况(如果这件事还远的话,请原谅):

代码语言:javascript
复制
import sys
from PyQt4 import QtGui, QtCore

class AnimateBetweenNums(QtCore.QVariantAnimation):
    def __init__(self):
        QtCore.QVariantAnimation.__init__(self)

    def updateCurrentValue(self, value):
        print value.toString()


class MyProgressbar(QtGui.QWidget):

    def __init__(self):
        super(MyProgressbar, self).__init__()
        self.initUI()

    def initUI(self):
        self.setMinimumSize(2, 2)
        self.value = 50

    def setValue(self, value):
        oldValue = 10
        newValue = 70

        anim = AnimateBetweenNums()
        anim.setStartValue(oldValue)
        anim.setEndValue(newValue)
        anim.setDuration(1000)
        anim.start()
        anim.valueChanged.connect(self.updateValue)

    def updateValue(self, value):
        self.value = value
        self.repaint()

    def paintEvent(self, e):
        qp = QtGui.QPainter()
        qp.begin(self)
        self.drawWidget(qp)
        qp.end()

    def drawWidget(self, qp):
        size = self.size()
        w = size.width()
        h = size.height()

        till = int(((w / 100.0) * self.value))

        #the bar
        qp.setPen(QtGui.QColor(255, 255, 255))
        qp.setBrush(QtGui.QColor(0, 228, 47))
        qp.drawRect(0, 0, till, h)

        #the box
        pen = QtGui.QPen(QtGui.QColor(75,80,100), 1, QtCore.Qt.SolidLine)
        qp.setPen(pen)
        qp.setBrush(QtCore.Qt.NoBrush)
        qp.drawRect(0, 0, w - 1, h - 1)


class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()

        self.initUI()

    def initUI(self):
        hbox = QtGui.QVBoxLayout()
        self.button10 = QtGui.QPushButton("10")
        hbox.addWidget(self.button10)
        self.button70 = QtGui.QPushButton("70")
        hbox.addWidget(self.button70)

        self.progress = MyProgressbar()
        hbox.addWidget(self.progress)

        self.setLayout(hbox)

        self.setGeometry(300, 300, 390, 210)
        self.show()

        self.button10.clicked.connect(self.changeValue10)
        self.button70.clicked.connect(self.changeValue70)

    def changeValue10(self, value):
        self.progress.setValue(10)
        self.progress.repaint()

    def changeValue70(self, value):
        self.progress.setValue(70)
        self.progress.repaint()


def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-26 20:55:06

下面是你的脚本的重写版本,希望能实现你想要的。动画对象应该只创建一次,而且由于您在PyQt4中使用Python2,所以需要确保正确地转换任何QVariant值。我还更改了setValue()方法,使其从以前的值重新启动。

代码语言:javascript
复制
import sys
from PyQt4 import QtGui, QtCore

class AnimateBetweenNums(QtCore.QVariantAnimation):
    def __init__(self):
        QtCore.QVariantAnimation.__init__(self)

    def updateCurrentValue(self, value):
        print value.toString()

class MyProgressbar(QtGui.QWidget):
    def __init__(self):
        super(MyProgressbar, self).__init__()
        self.initUI()

    def initUI(self):
        self.setMinimumSize(2, 2)
        self.anim = AnimateBetweenNums()
        self.anim.setDuration(1000)
        self.anim.valueChanged.connect(self.updateValue)
        self.value = 50

    def setValue(self, value):
        self.anim.setStartValue(self.value)
        self.anim.setEndValue(value)
        self.anim.start()

    def updateValue(self, value):
        self.value = QtCore.QVariant(value).toInt()[0]
        self.repaint()

    def paintEvent(self, e):
        qp = QtGui.QPainter()
        qp.begin(self)
        self.drawWidget(qp)
        qp.end()

    def drawWidget(self, qp):
        size = self.size()
        w = size.width()
        h = size.height()
        till = int(((w / 100.0) * self.value))

        #the bar
        qp.setPen(QtGui.QColor(255, 255, 255))
        qp.setBrush(QtGui.QColor(0, 228, 47))
        qp.drawRect(0, 0, till, h)

        #the box
        pen = QtGui.QPen(QtGui.QColor(75,80,100), 1, QtCore.Qt.SolidLine)
        qp.setPen(pen)
        qp.setBrush(QtCore.Qt.NoBrush)
        qp.drawRect(0, 0, w - 1, h - 1)


class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        hbox = QtGui.QVBoxLayout()
        self.button10 = QtGui.QPushButton("10")
        hbox.addWidget(self.button10)
        self.button70 = QtGui.QPushButton("70")
        hbox.addWidget(self.button70)
        self.progress = MyProgressbar()
        hbox.addWidget(self.progress)
        self.setLayout(hbox)
        self.setGeometry(300, 300, 390, 210)
        self.show()
        self.button10.clicked.connect(self.changeValue10)
        self.button70.clicked.connect(self.changeValue70)

    def changeValue10(self, value):
        self.progress.setValue(10)

    def changeValue70(self, value):
        self.progress.setValue(70)

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46961642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档