QtWebkit和QWebEngineView与Javascript交互
以前还是 QWebView 的时候和 Javascript 交互起来很方便,但是到了 Qt5.6 以后改用了 QWebEngineView ,并通过其提供的 qwebchannel.js 来进行交互。可能是由于刚出来的原因,这玩意儿有个 bug 就是必须在每次加载页面的时候手动注入,跳转页面后就失效了,需要手动注入,目前有没有修复具体未测试。这里对 QWebView 和 QWebEngineView 与 Js 交互都做了一个示例。
# 说明
针对 QWebView 通过 QWebFrame 的 addToJavaScriptWindowObject 把对象传递到 Javascript 中
针对 QWebEngineView 通过 QWebChannel.registerObject('Bridge', QObject) 把对象传递到 Javascript 中
可以通过 @pyqtSlot 装饰器来申明该方法可以暴露给 Javascript 调用
@pyqtSlot(str)
def callFromJs(self, text):
QMessag ...
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 ...
如何查阅Qt文档
很多网友在问有没有 PyQt5 的文档之类的问题,在 PyQt4 的时候 PyQt 官网有了英文版的文档,随后有网友翻译成了中文。不过现在 PyQt5 官方的文档都指向了 C 的 Qt 文档,其实 C 的 Qt API 文档结构很清晰,翻阅很容易的,需要注意几点。
作为一个开发人员确实需要具备查阅文档、查询资料等基础技能,会为自己的开发带来很大的帮助,要善于搜索,通过不同的方式去搜索才能找到自己需要的东西。
拿 Qt C++ 文档来说,官网地址是:https://doc.qt.io/qt-5/qtwidgets-module.html 这里面记录了所有控件的详细函数文档。
比如拿 输入框 QLineEdit 来说,怎么去查询它的用法和信号槽等资料?
https://doc.qt.io/qt-5/qlineedit.html
# 左侧目录
在文档左侧目录中有如下几个:
Properties - 控件里的属性(比如宽高等,通常需要当作函数调用)
Public Slots - 这个是控件自己的槽函数(当作普通函数就行)
Signals - 这个是输入框的包含的信号
Public Fun ...
推荐编辑器LiClipse
关于 Python 的开发编辑器有很多,每个人有每个人的喜好,经常看到很多在问什么编辑器好用,有人推荐 Sublime,有人推荐 Pycharm 等等,这里就不去比较其它编辑器的优缺点了,只谈谈关于 LiClipse 这个编辑器在初级使用阶段的智能提示功能等。开箱即用,支持多种语言,RST,Markdown 和 HTML 编辑器的 HTML 预览。
其实 LiClipse 这个编辑器就是以前的 PyDev 插件的独立版本,基于 Eclipse 编辑器开发,去掉了 Java 的相关开发功能,关于软件的详细说明可以去官网查看: http://www.liclipse.com/
编辑器只需要少量的配置,打开即可使用,快速自动 import,也可以根据需要安装自己所需的插件,比如 json、svn、主题插件等。个人推荐:适合刚入门的新手使用
由于新版的 PyQt 和 PyDev 去掉了详细的函数提示,所以 PyQt 的智能提示只有函数和返回值,并没有英文注释,但是以前的比如 PyQt4 的智能提示应该是有详细的英文注释提示。
# 界面预览
主界面
鼠标悬停提示
输入提示
Git 面板 ...
三种方式绑定信号槽
网上关于 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_ ...
python 拷贝虚拟环境(一)
通常来说,刚开始使用 python 的时候都是把包装到全局路径,随着各个项目安装的包越来越多,之后每开始一个项目,pycharm 创建索引的时间都越来越漫长,所以不可避免得开始使用虚拟环境。
经过一番了解 ,虚拟环境的优点有这些:
改善 pycharm 索引时间;
各个项目的库不会冲突;
理论上虚拟环境可以给同版本的操作系统使用 (未试验过);
pip freeze > requestment.txt 导出的依赖清晰;
各个版本的 python 共存;
…
python 虚拟环境库除了自带的 venv , 还有三方库 virtualenv , 此外 在 virtualenv 基础上又开发了 virtualenvwrapper(virtualenvwrapper_win) 来管理
本文基于 virtualenvwrapper 创建的虚拟环境来讲解.
以下是收集的一些virtualenvwrapper配置教程:
# linux平台
https://www.cnblogs.com/netfoxman/p/5994697.html
# window平台
https://bl ...
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 :设置是否允许拖至最大窗口
效果就是这样的:
正如图片所看的那样,窗体在移动的时候,窗体并没有绘制出来,而是绘制出窗体的边框,等到窗体不在移动的时候就直接把窗体图像数据全部绘制出来,这样就避免了窗体在 ...