PyQt5图形和特效之不规则窗口实现动画效果(八)

版权声明:如有使用转载,请附加出处 https://blog.csdn.net/jia666666/article/details/81875126

实例:不规则窗口实现动画效果

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class ShapeWidget(QWidget):
    def __init__(self,parent=None):
        super(ShapeWidget, self).__init__(parent)
        self.i=1
        self.mypix()
        self.timer=QTimer()
        self.timer.setInterval(500)
        self.timer.timeout.connect(self.timeChanged)
        self.timer.start()
    #显示不规则图片
    def mypix(self):
        self.update()
        if self.i==5:
            self.i=1
        self.mypic={1:'./images/left.png',2:'./images/up.png',3:'./images/right.png',4:'./images/down.png'}
        self.pix=QPixmap(self.mypic[self.i],'0',Qt.AvoidDither|Qt.ThresholdAlphaDither|Qt.ThresholdDither)
        self.resize(self.pix.size())
        self.setMask(self.pix.mask())
        self.dragPosition=None
    def mousePressEvent(self, QMouseEvent):
        if QMouseEvent.button()==Qt.LeftButton:
            self.m_drag=True
            self.m_DragPosition=QMouseEvent.globalPos()-self.pos()
            QMouseEvent.accept()
            self.setCursor(QCursor(Qt.OpenHandCursor))
    def mouseMoveEvent(self, QMouseEvent):
        if Qt.LeftButton and self.m_drag:
            self.move(QMouseEvent.globalPos()-self.m_DragPosition)
            QMouseEvent.accept()
    def mouseReleaseEvent(self, QMouseEvent):
        self.m_drag=False
        self.setCursor(QCursor(Qt.ArrowCursor))

    def paintEvent(self, QPaintEvent):
        painter=QPainter(self)
        painter.drawPixmap(0,0,self.pix.width(),self.pix.height(),self.pix)

    def mouseDoubleClickEvent(self, QMouseEvent):
        if QMouseEvent.button()==1:
            self.i+=1
            self.mypix()
    def timeChanged(self):
        self.i+=1
        self.mypix()

if __name__ == '__main__':
    app=QApplication(sys.argv)
    form=ShapeWidget()
    form.show()
    sys.exit(app.exec_())

运行程序,效果如下
这里写图片描述](https://img-blog.csdn.net/20  180820172205452?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ppYTY2NjY2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)![这里写图片描述这里写图片描述这里写图片描述

代码分析

运行这个例子,会弹出一个窗口,显示不同方向的箭头,每0.5秒改变一次方向

pixmap.setMask()函数的作用是为调用它的控件增加一个遮罩,遮住所选区域以外的地方,使控件看起来是透明的,它的参数是一个QBitmap对象或一个QRegion对象

本例中调用QPixmap实例的self.pix.mask()函数获得图片自身的遮罩,这个遮罩是一个QBitmap对象

 self.pix=QPixmap(self.mypic[self.i],'0',Qt.AvoidDither|Qt.ThresholdAlphaDither|Qt.ThresholdDither)
        self.resize(self.pix.size())
        self.setMask(self.pix.mask())

paintEvent()函数每次初始化窗口时只调用一次,所以没加载一次图片就要重新调用一次paintEvent()函数,即在更新窗口时调用这个函数,更新窗口的核心代码如下

        self.timer=QTimer()
        self.timer.setInterval(500)
        self.timer.timeout.connect(self.timeChanged)
        self.timer.start()

当定时器的时间到期后更新窗口代码

self.update

实例:加载GIF动画效果

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class LoadingGifWin(QWidget):
    def __init__(self,parent=None):
        super(LoadingGifWin, self).__init__(parent)
        #实例化标签到窗口中
        self.label=QLabel('',self)
        #设置标签的宽度与高度
        self.setFixedSize(128,128)
        #设置无边框
        self.setWindowFlags(Qt.Dialog | Qt.CustomizeWindowHint)

        self.movie=QMovie('./images/loading.gif')
        self.label.setMovie(self.movie)
        self.movie.start()
if __name__ == '__main__':
    app=QApplication(sys.argv)
    load=LoadingGifWin()
    load.show()
    sys.exit(app.exec_())

运行效果
这里写图片描述

相关源码及素材
https://download.csdn.net/download/jia666666/10616087

猜你喜欢

转载自blog.csdn.net/jia666666/article/details/81875126