PyQt5, как обновить QLabel как анимацию - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу использовать свой qlabel в качестве обратного отсчета.В основном, когда вызывается обратный отсчет, метка меняется «3 2 1 begin», с интервалом в 1 секунду.

однако, если я сделаю это:

def nextSound(self):

    self.mainLabel.setText("3")

    sleep(1)

    self.mainLabel.setText("2")

    sleep(1)
    self.mainLabel.setText("1")

, то просто дождусь конца, не обновляя метку.Поэтому я пытаюсь использовать QPropertyAnimation:

  def nextSound(self):

        self.animate = QPropertyAnimation(self.mainLabel,"setText")

        self.animate.setDuration(1000)
        self.animate.startValue("3")
        self.animate.setEndValue("2")
        self.animate.start()

Но получил эту ошибку:

self.animate = QPropertyAnimation(self.mainLabel,"setText")
TypeError: arguments did not match any overloaded call:
  QPropertyAnimation(parent: QObject = None): too many arguments
  QPropertyAnimation(QObject, Union[QByteArray, bytes, bytearray], parent: QObject = None): argument 2 has unexpected type 'str'

Любое предложение?Спасибо

1 Ответ

0 голосов
/ 21 ноября 2018

QPropertyAnimation основан на интерполяции значений, которые принимает q-свойство, когда я хочу использовать setText, я думаю, что наиболее близким является текст q-свойства, но тексты не могут быть интерполированы, поэтому решение будет заключаться в созданииq-свойство, которое принимает числовое значение.

from PyQt5 import QtCore, QtWidgets

class NumLabel(QtWidgets.QLabel):
    def number(self):
        try:
            return int(self.text())
        except:
            return 0
    def setNumber(self, number):
        self.setNum(number)
    number = QtCore.pyqtProperty(int, fget=number, fset=setNumber)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = NumLabel(alignment=QtCore.Qt.AlignCenter)
    w.resize(640, 480)
    animation = QtCore.QPropertyAnimation(w, b'number')
    animation.setStartValue(3)
    animation.setEndValue(0)
    animation.setDuration(1000*(abs(animation.endValue() - animation.startValue())))
    animation.start()
    w.show()
    sys.exit(app.exec_())

Другим лучшим вариантом является использование QTimeLine:

from PyQt5 import QtCore, QtWidgets

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QLabel(alignment=QtCore.Qt.AlignCenter)
    w.resize(640, 480)
    start = 3
    end = 0
    timeLine = QtCore.QTimeLine(abs(end - start)*1000, w)
    timeLine.setFrameRange(start, end)
    timeLine.frameChanged.connect(w.setNum)

    # set start value
    w.setNum(start)
    # start timer
    timeLine.start()

    w.show()
    sys.exit(app.exec_())
...