pyqt5中動畫的使用

1、pyqt5中動畫的繼承關係圖

pyqt5中動畫類的繼承

2、關於QAbstractAnimation父類的認識

  • 一、主要做用app

    • 繼承此類, 實現一些自定義動畫
    • 全部動畫共享的功能
  • 二、功能做用函數

    • 循環操做
      • setLoopCount(count):設置循環次數
      • currentLoop():當前循環
      • currentLoopTime():當前循環時間
    • 時間操做
      • duration():單次時長
      • totalDuration():動畫總時長
      • currentTime():當前時長
    • 動畫方向
      • setDirection(QAbstractAnimation.Forward/QAbstractAnimation.Backward)
    • 動畫狀態state()
      • QAbstractAnimation.Stopped:動畫中止
      • QAbstractAnimation.Paused:動畫暫停
      • QAbstractAnimation.Running:動畫運行

3、QPropertyAnimation屬性動畫的使用

主要用於實現某個屬性值從x到y的動畫變化oop

  • 一、定義動畫的主要步驟動畫

    • 建立一個動畫,並設置目標、屬性
    • 設置屬性值的開始、插值、結束
    • 動畫時長
    • 啓動動畫
  • 二、構造函數使用方式ui

    • 1.QPropertyAnimation(parent: QObject = None)
      • 設置動畫目標:setTargetObject(self, QObject)
      • 設置動畫屬性(位置、大小等):setPropertyName(self, Union[QByteArray, bytes, bytearray])
    • 2.QPropertyAnimation(QObject, Union[QByteArray, bytes, bytearray], parent: QObject = None)
  • 三、常見的屬性spa

    • geometry
    • pos
    • size
    • windowOpacity
  • 四、設置開始值和結束值code

    • setStartValue(self, Any)
    • setEndValue(self, Any)
    • setKeyValueAt(self, float, Any)
    • setKeyValues(self, object)
  • 五、設置動畫時長cdn

    • setDuration(int mesc)
  • 六、啓動動畫blog

    • start()
  • 七、簡單案例(位置的)繼承

    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(100, 100)
            self.btn.move(0, 0)
            self.btn.setStyleSheet('QPushButton{border: none; background: pink;}')
    
            # 1.定義一個動畫
            animation = QPropertyAnimation(self)
            animation.setTargetObject(self.btn)
            animation.setPropertyName(b'pos')
            # 使用另一種構造函數方式建立
            # animation = QPropertyAnimation(self.btn, b'pos', self)
    
            # 2.設置屬性值
            animation.setStartValue(QPoint(0, 0))
            animation.setEndValue(QPoint(400, 400))
    
            # 3.設置時長
            animation.setDuration(3000)
    
            # 4.啓動動畫
            animation.start()
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        window = Window()
        window.show()
        sys.exit(app.exec_())
    複製代碼
  • 八、使用插值的動畫

    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.建立動畫
            animation = QPropertyAnimation(self.btn, b'pos', self)
            
            # 2.定義動畫插值
            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.動畫時長
            animation.setDuration(5000)
            # 4.啓動動畫
            animation.start()
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        window = Window()
        window.show()
        sys.exit(app.exec_())
    複製代碼

4、QAnimationGroup動畫組的使用

能夠將一組動畫, 同時播放或者按順序播放

  • 一、使用的步驟

    • 根據上面的方式建立單獨的動畫(但不啓動)
    • 定義一個動畫組
    • 將以前的動畫添加到動畫組中
    • 啓動動畫組
  • 二、動畫運行幾種狀態

    • 並行動畫QParallelAnimationGroup
    • 串行動畫QSequentialAnimationGroup
  • 三、一個動畫組的案例

    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.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的動畫
            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的動畫
            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_())
    複製代碼

5、關於QAbstractAnimation中事件的操做

  • 一、啓動動畫start()

  • 二、暫停動畫pause()

  • 三、繼續啓動動畫resume()

  • 四、中止動畫stop()

  • 五、基本案例

    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.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的動畫
            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的動畫
            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_())
    複製代碼
相關文章
相關標籤/搜索