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 ...
QDataWidgetMapper 数据库绑定 QLineEdit控件
qt 为操作数据库提供了一个 model+view 的模式,这样简单的出入库逻辑就不需要自己编写。
QDataWidgetMapper 可以 将数据库的数据 映射到其他控件 。
注意:表格里的数据修改 还没有提交到数据库,需要点击提交按钮才生效。
https://github.com/PyQt5/PyQt/tree/master/Test/partner_625781186/16_sqlModel/01_mapper
# 代码
#-*- coding: utf-8 -*-
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtSql import *
import sys
sys.path.append('./ui')
from Ui_MainWindow import Ui_MainWindow
class MainWindow(QMainWind ...
PyQt5显示.9格式的PNG图片
做过安卓开发的和使用过 QQ 的都知道 .9.png 这种图片格式,效果就如 QQ 的聊天气泡一样可以拉伸,这种格式的图片允许开发人员定义可扩展区域,当需要延伸图片以填充比图片本身更大区域时,可扩展区的内容被延展;允许开发人员定义内容显示区,用于显示文字或其他内容。目前在 Github 上有两个 C++ 版本的,在这里我把它们都用 Python 实现了一遍。另外一个我也为 PyQt 提供了编译好的 pyd 文件。
# C++ 版本
在 Github 开源库中搜索到两个 C++ 版本的
一个是 NinePatchQt
一个是 QtNinePatch
# PyQt5 版本
这里也分为两个版本,都是基于上面的 C++ 源码翻译改写过来的,具体的例子见项目里面的测试代码吧。
QtNinePatch 是参考第一个源码编写,用法是在 paintEvent 中调用
QtNinePatch2 是参考第二个源码编写,用法是 pixmap = QtNinePatch.createPixmapFromNinePatchImage(self.image, self.width(), self. ...
PyQt5菜单之多选功能
有时候会遇到这种需求:在界面某个位置弹出一个菜单,其中里面的菜单项可以多选(类似配置选项),此时用 QMenu 会遇到点击一个菜单项就会自动关闭,当然可以通过其他方式实现该功能,不过这里就采用 QMenu 通过特殊的方式来实现该需求。
# 需求
要实现的效果:
菜单 1
菜单 2
菜单 3
菜单 4
点击菜单 1、2、3 可以多选不关闭菜单
点击菜单 4 可以勾选,并且关闭菜单
# 原理
设置菜单项可勾选:通过 QAction.setCheckable(True) 方法实现
设置菜单不可关闭:通过覆盖 QMenu 的鼠标释放 mouseReleaseEvent 方法(可直接替换或者通过 installEventFilter 安装事件过滤器实现)
在菜单的鼠标释放事件中,当点击菜单项后是通过点击点坐标来查找是否有 QAction ,然后触发对应的 QAction 。
故在没有 QAction 的地方则直接交还给 QMenu 自行处理逻辑,在有 QAction 的地方可以根据自己的需求进行处理(如上所提)
# 代码
#!/usr/bin/env python
# ...
多线程之守护线程和阻塞线程
如果你设置一个线程为守护线程,就表示你在说这个线程是不重要的,在进程退出的时候,不用等待这个线程退出。如果你的主线程在退出的时候,不用等待那些子线程完成,那就设置这些线程的 daemon 属性。
即在线程开始(thread.start ())之前,调用 setDeamon()函数,设定线程的 daemon 标志。
(thread.setDaemon (True))就表示这个线程 “不重要”。
如果你想等待子线程完成再退出,那就什么都不用做,或者显示地调用 thread.setDaemon (False),设置 daemon 的值为 false。新的子线程会继承父线程的 daemon 标志。
整个 Python 会在所有的非守护线程退出后才会结束,即进程中没有非守护线程存在的时候才结束。
setDaemon () 函数要放在 start 之前设置才行。
import threading
import time
def func():
print("子线程开启:", time.localtime())
time.sleep(2)
print("子线程结束:", ...
PyQt5结合Asyncio异步
今天尝试了下 quamash 框架,该框架是一个 PyQt 的异步事件循环封装库,使用 Python3+ 的 asyncio 这个异步库。在看了该项目的内容后发现只有一个简单的进度条例子,故尝试用其来下载网络图片并显示。
# 安装依赖
pip install quamash
pip install aiohttp
Python3.5+ 和 PyQt5
这里使用 aiohttp 是因为它基于 asyncio 封装的网络操作库,常见的 get 、 post 等方法,不过它只支持 Python3.5 及以上的版本,主要是它使用了 async def 这样的语法。
# 说明
在创建 QApplication 后随即设置替换事件循环 loop
app = QApplication(sys.argv)
loop = QEventLoop(app)
asyncio.set_event_loop(loop)
w = Window()
通过 asyncio.ensure_future(func(), loop=loop) 来执行某个异步函数
# 流程
Wi ...
PyQt5仿网页图片鼠标移动特效
em,就是类似于那种游戏官网首页的图片,鼠标放上去后来回移动,图片的前景和背景错位移动。
# 原理分析
2 张一样大小的透明图片,1 张作为背景,一张作为前景(比如说人物)。
当鼠标往左移动时,前景人物跟着往左移动,背景往右移动
计算好偏移量(见代码中)
https://github.com/PyQt5/PyQt/blob/master/QLabel/ImageSlipped.py
# 关键代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on 2018年10月18日
@author: Irony
@site: https://pyqt5.com https://github.com/892768447
@email: 892768447@qq.com
@file: ImageSlipped
@description:
"""
from PyQt5.QtGui import QPixmap, QPainter
from PyQt5.QtWidgets import QWidget
__Author__ ...
PyQt5窗口跟随其它窗口
要实现 PyQt 窗口跟随其它外部的窗口,能想到两点办法,一个是 hook 系统事件得到目标窗口的位置和大小以及是否关闭等,二是通过循环检测窗口的位置来实现。
# 基于 Windows 定时检测目标窗口
利用 win32gui 模块获取目标窗口的句柄
通过句柄获取目标窗口的大小位置,并设置自己的位置
主要是检测时间,在 10 毫秒以下很流畅
窗口关闭是根据目标句柄无效来判断
https://github.com/PyQt5/PyQt/blob/master/Demo/FollowWindow.py
# 代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on 2018年10月22日
@author: Irony
@site: https://github.com/892768447
@email: 892768447@qq.com
@file: FollowWindow
@description:
"""
import os
from PyQt5.QtCore import QTimer
from P ...
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 -*-
...
PyQt5圆形图片
实现圆形图片的方法有很多,比如用遮罩(mask), 裁切等等。这里比较几种实现方式,选出个人认为最优的方案。
https://github.com/PyQt5/PyQt/blob/master/QLabel/CircleImage.py
# 采用 mask 方式
具体参考 【Qt】QLabel 实现的圆形图像 - 米罗西 - 博客园
# 画圆形遮盖(适合纯色背景)
原理是在原图片上画一个 4 角有颜色,中间圆形镂空的图片。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Created on 2017年8月25日
@author: Irony."[讽刺]
@site: https://pyqt5.com, https://github.com/892768447
@email: 892768447@qq.com
@description:
'''
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap, QPainter, QPainterPath
from Py ...