溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

pyqt5中動(dòng)畫的使用詳解

發(fā)布時(shí)間:2020-08-21 11:06:21 來源:腳本之家 閱讀:202 作者:水痕001 欄目:開發(fā)技術(shù)

一、pyqt5中動(dòng)畫的繼承關(guān)系圖

pyqt5中動(dòng)畫的使用詳解

二、關(guān)于QAbstractAnimation父類的認(rèn)識(shí)

1、主要作用

  • 繼承此類, 實(shí)現(xiàn)一些自定義動(dòng)畫
  • 所有動(dòng)畫共享的功能

2、功能作用

循環(huán)操作

  • setLoopCount(count):設(shè)置循環(huán)次數(shù)
  • currentLoop():當(dāng)前循環(huán)
  • currentLoopTime():當(dāng)前循環(huán)時(shí)間

時(shí)間操作

  • duration():單次時(shí)長
  • totalDuration():動(dòng)畫總時(shí)長
  • currentTime():當(dāng)前時(shí)長

動(dòng)畫方向

  • setDirection(QAbstractAnimation.Forward/QAbstractAnimation.Backward)

動(dòng)畫狀態(tài)state()

  • QAbstractAnimation.Stopped:動(dòng)畫停止
  • QAbstractAnimation.Paused:動(dòng)畫暫停
  • QAbstractAnimation.Running:動(dòng)畫運(yùn)行

三、QPropertyAnimation屬性動(dòng)畫的使用

主要用于實(shí)現(xiàn)某個(gè)屬性值從x到y(tǒng)的動(dòng)畫變化

1、定義動(dòng)畫的主要步驟

  • 創(chuàng)建一個(gè)動(dòng)畫,并設(shè)置目標(biāo)、屬性
  • 設(shè)置屬性值的開始、插值、結(jié)束
  • 動(dòng)畫時(shí)長
  • 啟動(dòng)動(dòng)畫

2、構(gòu)造函數(shù)使用方式

1.QPropertyAnimation(parent: QObject = None)

  • 設(shè)置動(dòng)畫目標(biāo):setTargetObject(self, QObject)
  • 設(shè)置動(dòng)畫屬性(位置、大小等):setPropertyName(self, Union[QByteArray, bytes, bytearray])

2.QPropertyAnimation(QObject, Union[QByteArray, bytes, bytearray], parent: QObject = None)

3、常見的屬性

  • geometry
  • pos
  • size
  • windowOpacity

4、設(shè)置開始值和結(jié)束值

  • setStartValue(self, Any)
  • setEndValue(self, Any)
  • setKeyValueAt(self, float, Any)
  • setKeyValues(self, object)

5、設(shè)置動(dòng)畫時(shí)長

  • setDuration(int mesc)

6、啟動(dòng)動(dòng)畫

  • start()

7、簡單案例(位置的)

import sys
from PyQt5.Qt import *


class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('動(dòng)畫')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn = QPushButton(self)
    self.init_ui()

  def init_ui(self):
    self.btn.resize(100, 100)
    self.btn.move(0, 0)
    self.btn.setStyleSheet('QPushButton{border: none; background: pink;}')

    # 1.定義一個(gè)動(dòng)畫
    animation = QPropertyAnimation(self)
    animation.setTargetObject(self.btn)
    animation.setPropertyName(b'pos')
    # 使用另外一種構(gòu)造函數(shù)方式創(chuàng)建
    # animation = QPropertyAnimation(self.btn, b'pos', self)

    # 2.設(shè)置屬性值
    animation.setStartValue(QPoint(0, 0))
    animation.setEndValue(QPoint(400, 400))

    # 3.設(shè)置時(shí)長
    animation.setDuration(3000)

    # 4.啟動(dòng)動(dòng)畫
    animation.start()


if __name__ == "__main__":
  app = QApplication(sys.argv)
  window = Window()
  window.show()
  sys.exit(app.exec_())

8、使用插值的動(dòng)畫

import sys
from PyQt5.Qt import *


class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('使用插值')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn = QPushButton(self)
    self.init_ui()

  def init_ui(self):
    self.btn.resize(50, 50)
    self.btn.move(0, 0)
    self.btn.setStyleSheet('QPushButton{border: none; background: pink;}')
    
    # 1.創(chuàng)建動(dòng)畫
    animation = QPropertyAnimation(self.btn, b'pos', self)
    
    # 2.定義動(dòng)畫插值
    animation.setKeyValueAt(0, QPoint(0, 0))
    animation.setKeyValueAt(0.25, QPoint(450, 0))
    animation.setKeyValueAt(0.5, QPoint(450, 450))
    animation.setKeyValueAt(0.75, QPoint(0, 450))
    animation.setKeyValueAt(1, QPoint(0, 0))
    # 3.動(dòng)畫時(shí)長
    animation.setDuration(5000)
    # 4.啟動(dòng)動(dòng)畫
    animation.start()


if __name__ == "__main__":
  app = QApplication(sys.argv)
  window = Window()
  window.show()
  sys.exit(app.exec_())

四、QAnimationGroup動(dòng)畫組的使用

可以將一組動(dòng)畫, 同時(shí)播放或者按順序播放

1、使用的步驟

  • 根據(jù)上面的方式創(chuàng)建單獨(dú)的動(dòng)畫(但不啟動(dòng))
  • 定義一個(gè)動(dòng)畫組
  • 將之前的動(dòng)畫添加到動(dòng)畫組中
  • 啟動(dòng)動(dòng)畫組

2、動(dòng)畫運(yùn)行幾種狀態(tài)

  • 并行動(dòng)畫QParallelAnimationGroup
  • 串行動(dòng)畫QSequentialAnimationGroup

3、一個(gè)動(dòng)畫組的案例

import sys
from PyQt5.Qt import *


class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('動(dòng)畫組')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn1 = QPushButton(self)
    self.btn2 = QPushButton(self)
    self.init_ui()

  def init_ui(self):
    self.btn1.resize(50, 50)
    self.btn1.move(0, 0)
    self.btn1.setStyleSheet('QPushButton{border: none; background: pink;}')

    self.btn2.resize(50, 50)
    self.btn2.move(50, 50)
    self.btn2.setStyleSheet('border: none; background: cyan')

    # 按鈕1的動(dòng)畫
    animation1 = QPropertyAnimation(self.btn1, b'pos', self)
    animation1.setKeyValueAt(0, QPoint(0, 0))
    animation1.setKeyValueAt(0.25, QPoint(450, 0))
    animation1.setKeyValueAt(0.5, QPoint(450, 450))
    animation1.setKeyValueAt(0.75, QPoint(0, 450))
    animation1.setKeyValueAt(1, QPoint(0, 0))
    animation1.setDuration(5000)
    # animation1.start()

    # 按鈕2的動(dòng)畫
    animation2 = QPropertyAnimation(self.btn2, b'pos', self)
    animation2.setKeyValueAt(0, QPoint(50, 50))
    animation2.setKeyValueAt(0.25, QPoint(400, 50))
    animation2.setKeyValueAt(0.5, QPoint(400, 400))
    animation2.setKeyValueAt(0.75, QPoint(50, 400))
    animation2.setKeyValueAt(1, QPoint(50, 50))
    animation2.setDuration(3000)
    # animation2.start()

    animation_group = QSequentialAnimationGroup(self)
    animation_group.addAnimation(animation1)
    animation_group.addAnimation(animation2)
    animation_group.start()


if __name__ == "__main__":
  app = QApplication(sys.argv)
  window = Window()
  window.show()
  sys.exit(app.exec_())

五、關(guān)于QAbstractAnimation中事件的操作

1、啟動(dòng)動(dòng)畫start()

2、暫停動(dòng)畫pause()

3、繼續(xù)啟動(dòng)動(dòng)畫resume()

4、停止動(dòng)畫stop()

5、基本案例

import sys
from PyQt5.Qt import *


class Window(QWidget):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.setWindowTitle('動(dòng)畫組')
    self.resize(500, 500)
    self.move(400, 200)
    self.btn1 = QPushButton(self)
    self.btn2 = QPushButton(self)
    self.init_ui()

  def init_ui(self):
    self.btn1.resize(50, 50)
    self.btn1.move(0, 0)
    self.btn1.setStyleSheet('QPushButton{border: none; background: pink;}')

    self.btn2.resize(50, 50)
    self.btn2.move(50, 50)
    self.btn2.setStyleSheet('border: none; background: cyan')

    # 按鈕1的動(dòng)畫
    animation1 = QPropertyAnimation(self.btn1, b'pos', self)
    animation1.setKeyValueAt(0, QPoint(0, 0))
    animation1.setKeyValueAt(0.25, QPoint(450, 0))
    animation1.setKeyValueAt(0.5, QPoint(450, 450))
    animation1.setKeyValueAt(0.75, QPoint(0, 450))
    animation1.setKeyValueAt(1, QPoint(0, 0))
    animation1.setDuration(5000)
    # animation1.start()

    # 按鈕2的動(dòng)畫
    animation2 = QPropertyAnimation(self.btn2, b'pos', self)
    animation2.setKeyValueAt(0, QPoint(50, 50))
    animation2.setKeyValueAt(0.25, QPoint(400, 50))
    animation2.setKeyValueAt(0.5, QPoint(400, 400))
    animation2.setKeyValueAt(0.75, QPoint(50, 400))
    animation2.setKeyValueAt(1, QPoint(50, 50))
    animation2.setDuration(8000)
    # animation2.start()

    animation_group = QParallelAnimationGroup(self)
    animation_group.addAnimation(animation1)
    animation_group.addAnimation(animation2)
    animation_group.start()

    self.btn1.clicked.connect(animation_group.pause)
    self.btn2.clicked.connect(animation_group.resume)


if __name__ == "__main__":
  app = QApplication(sys.argv)
  window = Window()
  window.show()
  sys.exit(app.exec_())

到此這篇關(guān)于pyqt5中動(dòng)畫的使用詳解的文章就介紹到這了,更多相關(guān)pyqt5 動(dòng)畫內(nèi)容請搜索億速云以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持億速云!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI