如何在Mac M1上快速安装PyQt5
由于官方并没有在 M1 上编译 PyQt 导致安装存在一些问题。
M1 上的 Python 不能直接使用 x64 的 PyQt5。但是 M1 上可以运行 x64 的 Python。所以通过安装 x64 的 Python 然后再安装 PyQt5 即可。
1. 安装 Python
python-3.9.13-macosx10.9.pkg
2. 勾选自定义同时只勾选安装 pip
3. 设置 pip 源
/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3 install pqi
/Library/Frameworks/Python.framework/Versions/3.9/bin/pqi use tuna
4. 安装 PyQt5
/Library/Frameworks/Python.framework/Versions/3.9/bin/pip3 install PyQt5
5. 测试
/Library/Frameworks/Python.framework/Versions/3.9/bin/python3
📢📢� ...
PyQt学习心得
在学习 PyQt 的过程中由于资料的缺乏或者没有中文导致大多数人感叹资料太少,学习困难,又或者急于求进,赶鸭子上架的情况,此时有系统的学习方法很重要。每个人都需要有自己的学习方法,别人的学习方法并不一定适合自己但可以采纳一些。笔者在这里列举了一些当初自己自学的一些心得和方法,希望帮助大家建立一套自己的学习 PyQt 的方法,提高自身的学习能力。
# Python 基础
在学习和使用 PyQt 之前需要熟练使用 Python,经过对 QQ 群里经常提问的问题的分析,发现大部分人对 Python 中的基础知识掌握不牢固导致很多基础问题,如果要想更好的使用 Python 以及它的扩展必需要进行系统的学习。这里列举一下常用的知识点。
类 参考资料
类的继承
类的多继承
类方法重写 参考资料
类中的 super 函数 参考资料
函数调用 / 参数类型
对象调用 (参考第 1 点)
必须熟练掌握上面的知识点后入门 PyQt 才比较容易,如果初学者对上面的知识点还不是很了解,本文不适合继续往下阅读。
# 设计师
Qt 设计师除了方便快速设计一些简单的界面外,其实笔者觉 ...
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 ...
三种方式绑定信号槽
网上关于 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 :设置是否允许拖至最大窗口
效果就是这样的:
正如图片所看的那样,窗体在移动的时候,窗体并没有绘制出来,而是绘制出窗体的边框,等到窗体不在移动的时候就直接把窗体图像数据全部绘制出来,这样就避免了窗体在 ...