PyQt5判断信号是否连接
在 PyQt 中某些情况下需要取消原来的信号连接,此时需要使用 disconnect 方法,但是在逻辑不严谨的情况下可能会导致多次调用 disconnect 方法而导致报错,当然可以通过 try except 来包裹代码。这里通过 isSignalConnected 来判断信号是否连接。
在 QOjbect 文档中这样写到:
static const QMetaMethod valueChangedSignal = QMetaMethod::fromSignal(&MyObject::valueChanged);
if (isSignalConnected(valueChangedSignal)) {
QByteArray data;
data = get_the_value(); // expensive operation
emit valueChanged(data);
}
通过直接传入信号就行了,但是这在 PyQt 中不可行。需要这么做
#!/usr/bin/en ...
PyQt5无边框圆角阴影
在做 PyQt 窗口开发中经常会遇到要做一些无边框不规则的窗口,可能还会带有阴影效果,这里演示做一个简单的无边框圆角的窗口,原理就在于背景窗口的透明和一层有色背景控件的叠加。
# 原理说明
黑色(方便说明)的 QDialog 或者 QWidget 作为全透明无边框窗口。
其中白色的 QWidget 才是主要显示圆角和阴影的窗口,用于承载其它控件的显示。
注意红色和紫色的方框内的层次。
另:如果要熟悉纯代码编写请看 FramelessDialog.py
如图:
# 代码
https://github.com/PyQt5/PyQt/blob/master/Demo/FramelessDialog.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on 2019年4月25日
@author: Irony
@site: https://pyqt5.com https://github.com/892768447
@email: 892768447@qq.com
@file: FramelessWidget
...
在Mac上以正确的姿势使用PyQtClient看Demo
由于 PyQtClient 只提供了 Windows 的版本,这里记录下编译后在 Mac 上运行。
# 下载项目
安装 git 略。没有的东西可以都先去试试 brew install xxx。没安装 homebrew 的建议使用搜索引擎
git clone https://github.com/PyQt5/PyQtClient.git
# 配置环境
打开 IDE 配置 python 环境,使用 anaconda 比较方便
推荐用 pycharm,我是习惯了用 idea。anaconda 安装可以去官网下载。
环境原因,选择新建一个 python 3.6 p.s. 我取的环境名字就是 3.6 所以后面的 3.6 其实是这个原因
# conda 源
最好是加环境变量,不加也可以,就是以后用到的都需要指定路径,不太常用,我就没加
~/anaconda3/bin/conda config --add channels conda-forge
~/anaconda3/bin/conda config --add channels ...
PyQtClient例子客户端
对本博客所写的项目 PyQt 例子进行一个客户端的编写,客户端主要实现一些动画效果,更换皮肤,运行例子等功能。
# 项目地址
# Windows 客户端下载
包含部分例子
不包含例子
百度网盘 提取码: nadv
# 效果图
PyQt5编译QWebView与QWebEngineView共存
在 PyQt5.5 过后移除了 QWebView 控件,改用 QWebEngineView ,但是这个刚开始用起来不是很方便,最近在整理一些例子的时候需要同时使用 QWebView 和 QWebEngineView ,故希望把 QWebView 重新加入到后面的 PyQt5 版本中,查看 PyQt5.10.1 的源码发现里面其实是有 QWebView 的,只是因为 Qt5.10.1 中没有编译好的 dll 等导致无法编译。
# 准备工作
安装 VS2015
安装 Qt5.10.1
前往 https://github.com/annulen/webkit/releases 下载对应的文件,比如:qtwebkit-5.212.0_alpha2-qt59-msvc2015-x86.zip
下载 PyQt5.10.1 源码
下载对应版本的 sip 源码
# 编译
设置环境变量 set PATH=D:\soft\Qt\Qt5.10.1\5.10.1\msvc2015\bin;%PATH%
首先进入 vs2015 命令行编译 sip 并安装, python configure.py ...
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之QSlider滑动条点击定位
QSlider 在通常情况下支持鼠标点击可以任意拖动,或者鼠标点击则往鼠标点击的方向移动一小格,这种移动一小格通常情况下用起来很不方便,比如我要做一个播放器的播放进度条,肯定是点击某个位置就直接跳到该位置,为此需要对 QSlider 的鼠标事件 mousePressEvent 进行重写。
# 实现方法
一般的想法就是重写 mousePressEvent 后,得到鼠标点击的 x 和 y 点然后进行比例换算,再通过 setValue 来设置值,其实 QSlider 的 style 里面是有一个 sliderValueFromPosition 方法来计算值的。直接调用这个方法即可。
首先通过 QSlider.style().subControlRect 方法计算得到滑块的区域,当鼠标点击区域在此次时则交给系统自己处理(比如按住不放拖动)
通过 orientation 判断滑动条的方向(横竖)
通过 invertedAppearance 判断滑动条是否反向(左右、上下)
通过 QSlider.style().sliderValueFromPosition(最小值, ...
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. ...