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
...
解决GitHub下载速度缓慢的问题
由于 Github 的下载走的是 AWS - 亚马逊的路线,,so slow,跟乌龟一样慢。。照着一些方法改了 hosts 文件,偶尔能提提速度。
# Windows
Hosts 文件的路径是:
C:\Windows\System32\drivers\etc
# Mac
终端内输入:
sudo vim /etc/hosts
# 追加域名的 IP 地址
利用 https://www.ipaddress.com/ 来获得以下两个 GitHub 域名的 IP 地址:
(1) github.com
(2) github.global.ssl.fastly.net
打开网页后,利用输入框内分别查询两个域名
将以上两段 IP 写入 Hosts 文件中:
192.30.253.112 github.com
151.101.185.194 github.global.ssl.fastly.net
保存。
刷新 DNS 缓存
在终端或 CMD 中,执行以下命令:
ipconfig /flushdns
在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 ...
Python调用Java对Excel截图
有的时候会遇到一些奇葩的需求,就是用 Excel 做报表,但是需要对里面的数据进行填充并生成报表图片,发送出去。这里记录用 python 调用 jar 包对 excel 文件进行公式计算和截图,数据填充可以用 xlrd 或者 openpyxl
利用 jpype 模块初始化 java 虚拟机加载 jar 包然后执行其中的功能。
# 代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on 2019年3月12日
@author: Irony
@site: https://pyqt5.com https://github.com/892768447
@email: 892768447@qq.com
@file: CallJava
@description:
"""
import os
import jpype
__Author__ = 'Irony'
__Copyright__ = 'Copyright (c) 2019'
def convertToImage():
Workbook = jpyp ...
FFmpeg合成加密HLS记录
记录在某个需求中要求截图并合成加密视频文件,这里采用 FFmpeg 的管道流来实现生成 HLS 加密文件。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on 2019年3月4日
@author: Irony
@site: https://pyqt5.com https://github.com/892768447
@email: 892768447@qq.com
@file:
@description:
"""
from pathlib import Path
from subprocess import Popen, PIPE
__Author__ = """By: Irony
QQ: 892768447
Email: 892768447@qq.com"""
__Copyright__ = 'Copyright (c) 2019 Irony'
__Version__ = 1.0
# p = Popen([r'D:\soft\ffmpeg\bin\ffmpeg.exe', '-y',
# ...
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 ...
python 在类里使用进程池
首先, 进程池的作用就是减少进程的创建和释放 开销的, 所以在类中作为局部变量是不合适的;
其次, 进程池必须在 if __name__ == "__main__" 里 ,否则会报 frozen_ 什么什么的错误;(这一点可能解释有误);
然后, 线程池的 apply_async 中如果传入 self.xxx 方法,会报 multiprocessing.Pool pickling error 什么的错误, 具体解释见 https://blog.csdn.net/dutsoft/article/details/70336462, 里面有解决方法,但是我没有成功(最开始测试没有现在理解的透彻, 不过应该是可以的); 由于第 1 点 不合理, 所以有什么办法在类 函数中获取 进程池对象 po 的地址:
我的解决思路和方法是:
通过 globals () 取得全局变量 , 测试证明 :不同文件的 globals() 是不同的: 如 Tab2.py 的 globals() 和 main_extra_func_file.py 中的 globa ...
PyQt5之QSlider滑动条点击定位
QSlider 在通常情况下支持鼠标点击可以任意拖动,或者鼠标点击则往鼠标点击的方向移动一小格,这种移动一小格通常情况下用起来很不方便,比如我要做一个播放器的播放进度条,肯定是点击某个位置就直接跳到该位置,为此需要对 QSlider 的鼠标事件 mousePressEvent 进行重写。
# 实现方法
一般的想法就是重写 mousePressEvent 后,得到鼠标点击的 x 和 y 点然后进行比例换算,再通过 setValue 来设置值,其实 QSlider 的 style 里面是有一个 sliderValueFromPosition 方法来计算值的。直接调用这个方法即可。
首先通过 QSlider.style().subControlRect 方法计算得到滑块的区域,当鼠标点击区域在此次时则交给系统自己处理(比如按住不放拖动)
通过 orientation 判断滑动条的方向(横竖)
通过 invertedAppearance 判断滑动条是否反向(左右、上下)
通过 QSlider.style().sliderValueFromPosition(最小值, ...