PyQt5窗口翻转动画
QQ 的界面一直是用来模仿练习做界面的好东西,这里就有一个类似 QQ 登录界面的实现翻转效果,当然这里并没有用两个窗口去做,而是用了 QStackedWidget 包含两个控件做切换,同时单独使用一个窗口做动画绘制。
# 原理说明
用了两个 QLabel 来显示模拟的图片界面,并实现鼠标点击模拟真实的窗口对应位置点击
用了 QStackedWidget 来存放上面的两个界面 QLabel
点击切换时主要是对上面的两个界面进行截图并传递给翻转动画窗口
通过 setWindowOpacity 控制主窗口的显示隐藏(保留任务栏),当然也可以用 hide
动画窗口 FlipWidget.py 主要实现两张图片的翻转显示,考虑到 0-90 和 90-180 之前的情况,以及图片的缩放动画
# 核心实现
主要是在 paintEvent 方法中使用 QTransform 对 QPainter 进行圆心变换以及 rotate 设置翻转角度
同时根据翻转的角度范围对图片进行切换和缩放
def paintEvent(self, event):
super(FlipWid ...
PyQt属性动画(QPropertyAnimation)
QPropertyAnimation 继承自 QVariantAnimation ,其作为 Qt 的属性动画用于针对控件的属性或者继承自 QObject 的对象中定义的属性做修改,
简单来说就是基类是 QObject 且定义了属性变量,就可以用 QPropertyAnimation 来做属性动画。同时也可以通过 pyqtProperty 来增加自定义属性。
首先,通过构造函数 QPropertyAnimation(QObject, Union[QByteArray, bytes, bytearray], parent: QObject = None) 创建一个对象,其中
第一个参数是动画作用的对象,也可以通过 setTargetObject 设置
第二个参数是属性名,在 py3 中类型是 bytes,也可以通过 setPropertyName 设置
# 函数
一些常见的设置函数
setPropertyName
设置属性名
setTargetObject
设置动画作用对象
setDuration
设置动画持续时间(毫秒)
setStar ...
PyQt5之图片轮播
之前看到了 QStackedWidget 做切换动画,让界面不那么生硬,于是参考了 http://qt.shoutwiki.com/wiki/Extending_QStackedWidget_for_sliding_page_animations_in_Qt 做了一个 QStackedWidget 的切换动画,然后利用 QStackedWidget 结合多个 QLabel 显示图片来做一个轮播效果。
其实在写之前也在网上找了很多例子,参看过后发现大多例子都是利用到了 paintEvent 去绘制,这样其实还是比较麻烦,个人觉得更好的方式是使用 QPropertyAnimation 属性动画修改控件中 QLabel 图片控件的 pos 位置属性就可以达到移动效果了。
比较核心的算法就是要计算当前页面和下一个页面的位置偏移量,比如:
# 计算偏移量
offsetX = self.frameRect().width()
offsetY = self.frameRect().height()
w_next.setGeometry(0, 0, offsetX, offsetY ...
PyQt5仿网页鼠标移动点阵特效
Orz,前段时间有个 zz 需求,就是要做一个类似网页上很多个多点连线、鼠标移动跟随的那种炫酷特效,然后花了点时间在网上找了 js 做的,刚开始打算是嵌入 QWebView 来显示网页,后来研究了下 js 的算法代码,遂改用 QWidget 的 paintEvent 直接绘制。
# 大概思路
先根据窗口大小随机创建一些点
遍历这些点并找到与之相关联的点
在动画过程中绘制圆点和画两点之间的连线
属性动画 QPropertyAnimation 改变颜色的透明度
# 题外
这里没有仔细去研究 js 里的算法优化,在浏览器里嗖嗖的就生成了,在 py 里好慢…
尽量在 py 里优化了循环操作,也简单的做了个 cython 加速也才提高了 1s ? 1 倍?..
不要只是为了好看用这玩意儿,和网页的效果一样,占 CPU !!! 没有任何意义
如果有更好的优化算法请告知,3Q
pyd 是 python3.4 生成的,删掉 pyd 也能运行
# 代码
https://github.com/PyQt5/PyQt/blob/master/QPropertyAnimation/Rlatti ...
PyQt5动画边框阴影
为子控件增加动画阴影效果,结合 QGraphicsDropShadowEffect 和 QPropertyAnimation 动态改变阴影半径达到效果,在旧版本的 Qt 中 QGraphicsDropShadowEffect 可能会有点问题(父控件会影响子控件)
# 原理
原理是利用 QGraphicsDropShadowEffect 添加边框阴影,然后使用动画不停改变阴影的模糊半径来达到效果,如图:
# 简单说明
继承 QGraphicsDropShadowEffect 增加动态属性 radius
通过 setGraphicsEffect 方法设置控件的边框阴影
通过 QPropertyAnimation 属性动画不断改变 radius 的值并调用 setBlurRadius 更新半径值
https://github.com/PyQt5/PyQt/blob/master/QGraphicsDropShadowEffect/ShadowEffect.py
# 自定义类
#!/usr/bin/env python
# -*- coding: utf-8 -*-
...