pytest-qt 测试模态窗体.
步骤分别是 :
点击 开始扫描 弹出 选择路径窗口;
勾选路基;
3. 点击确定;
大概想测一下这个界面 :
步骤分别是 :
点击 开始扫描 弹出 选择路径窗口;
勾选路基;
3. 点击确定;
需要测试的函数 :
测试函数 :
可以发现断言失败 .
官方文档:测试模态窗体.
https://pytest-qt.readthedocs.io/en/latest/note_dialogs.html
用的是官方的 monkeypatch 方式 .
大致意思就是替换 FileSelectPathDialog 类的 exec 函数.
三种方式绑定信号槽
网上关于 PyQt5 的信号绑定使用的教程比较上,很多还是以前的绑定方式,导致在 PyQt5 中无法使用,这里归纳总结下已有的几种绑定信号槽的方式,
这几种方式各有各的优点和缺点。
# 方式一
这个方式是最开始接触设计师的时候知道的,主要是通过控件的 objectName 和 QtCore.QMetaObject.connectSlotsByName(Form) 提供的连接函数来自动完成注册,
比如带有按钮的界面 ui 文件转成 py 文件后会发现如下代码:
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(60, 40, 93, 28))
self.pushButton.setObjectName("pushButton")
# 通过这里自动完成连接信号槽
QtCore.QMetaObject.connectSlotsByName(Form)
此时只需要继承该 UI 文件类然后增加如下方法:
@pyqtSlot()
def on_pushButton_ ...
QRunnable线程池发信号
因为只有继承 QObject 的类才能有信号和自定义信号,而 QRunnable 并不是继承自 QObject ,也不能用多继承的方式,这里考虑定义个全局的 QObject 变量用来存放一些定义好的可复用的信号。
pools 是 QThreadPool 实例
# 看图说话
定义一个全局信号类
在 QRunnable 中发送
如何和设计师中查看ui转换的py代码
通过 设计师 查看 ui 转换的 py 代码
当初我刚学 pyqt 的时候,也有很多疑惑,用什么属性把控件加到布局,改了这个属性会发生什么,为什么这个会这样,那个会那样 。。。 。。。
后来就看 ui 转成的 py 代码,注释一下,什么效果消失了,就是那个 api 引起的 。
再来后发现了官方文档,查一查函数就行了 .
但是有些 api 文档找起来麻烦,用设计师点几下就行了,然后把转换出来的代码拷贝一下就完事了.
可是需要单独把 ui 转为 py 文件,之后再删除这个文件也是很烦的一件事 .
好,话不多说,接下来手把手教你如何快速在 ui 中查看 py 代码 .
官方也考虑过这种情况,所以 设计师中 是有这个功能的,但是 qt 的是没问题的,pyqt 的毕竟是绑定过来的,所以正常来说 你点击之后会弹出一个找不到应用程序的提示 .
看到这个东西是不是很眼熟,我们用的命令 pyuic5 和这个东西应该是一样的 .
所以接下来,我们找找电脑上有没有这个东西
果然在 pyqt5-toos 文件夹下有这个东西,
我们根据第一张图的提示,把这个东西拷贝到相应的目录 (如果没有那个 bin ...
PyQt5调整窗口显示边框
在 windows 某些场景下调整窗口大小或者移动后就会导致里面的内容重绘(速度慢,卡顿,闪烁),其实在以前 windows 在低配置设备为了减少这种频繁绘制的情况,默认会开启这种效果,不过目前设备越来越好了就关闭了该功能。具体是在控制面板中 -> 调整 Windows 的外观和性能 -> 去掉勾选 拖动时显示窗口内容。
由于这个开关是全局状态的,而我们只需要在自己的窗口中实现该效果有两种方式。
一种是自己绘制一个边框效果,放开鼠标时才操作真正的窗口。
二是替换窗口的处理过程函数 wndproc 处理 WM_NCLBUTTONDOWN 消息事件。
今天讲第二种方法:
需要了解 SystemParametersInfo API 函数
SPI_GETDRAGFULLWINDOWS :确定是否允许拖拉到最大窗口
SPI_SETDRAGFULLWINDOWS :设置是否允许拖至最大窗口
效果就是这样的:
正如图片所看的那样,窗体在移动的时候,窗体并没有绘制出来,而是绘制出窗体的边框,等到窗体不在移动的时候就直接把窗体图像数据全部绘制出来,这样就避免了窗体在 ...
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 ...
在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 ...
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 ...