用 VS Code 搞Qt6:使用 PySide 6

一般来说,用C++写 Qt 应用才是正宗的,不过,为了让小学生也能体验 Qt 的开发过程,或者官方为了增加开发者人数,推出了可用 Python 来编程的 Qt 版本 。此版本命名比较奇葩,叫 PySide,与 Qt 6 配套的是 PySide 6 。当前最新版本是 6.3.2 。
PySide 的优势在于它是官方维护的,完全是C++开发的 。在原有库基础上增加了对应的 .pyd 文件,对 API 做了封装,并由 .pyi 文件进行类型规范 。在性能上是不用担心的,但是,这种开发方式用来学习较适合,真要做个应用程序 , 还是用C++好,编译出来就能用了 。Python 写的话打包要用其他工具,也麻烦,对于脚本语言 , 还得到处带上个解析器 。
PySide 6 可以通过 pip 直接安装就行了 。
在安装之前,老周建议先创建个虚拟环境 。一来专用性强,二来方便打包 。假设我要把虚拟环境存放在神奇的 E 盘下的 MyEnv 目录下,那么,可以执行:
python -m venv E:\MyEnv或者
python3 -m venv E:\MyEnv虚拟环境可以创建一个隔离的区域,有独立的 python 解析器、pip 程序等 。每个虚拟环境互不干扰 。在虚所环境的 Scripts 目录(Linux是 bin 目录)下,有两个文件很有用 。要启用虚拟环境,就执行 activate 文件;要退出虚拟环境,执行 deactivate 文件 。
接下来在刚建立的虚拟环境中安装 PySide 6 。先执行 activate 文件激活环境 , 然后执行命令:
pip install PySide6如果不能下载或下载特慢,请换国内的清华大学源 。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PySide6详细的使用方法请自行查看帮助说明,此话题对本文而言已超纲 。
------------------------------------------------------------------------------------------------------------------------------------
接下来该到 VS Code 了 。不需要什么特殊配置,安装微软官方的 Python 扩展即可 。
但是,不过,可是,然而,要注意:要先执行虚拟环境中的 activate 文件 , 然后在当前运行环境不变的前提下启动 VS Code 。在VS Code中也需要使用虚拟环境所设置的环境变量 。为了人性化 , 咱们可以在桌面上建一个批处理文件,然后输入以下内容:
@echo offcall E:\MyEnv\Scripts\activate.batstart C:\<你的VS Code 路径>\VSCode\Code.exeexit第一行不解释了 , 可自行度娘 。第二行是用 CALL 命令调用 activate 文件(在 Windows 上它是个批处理文件),这样虚拟环境就激活了 。第三行使用 start 命令启动 VS Code,这样 VS Code 就具备了虚拟环境的上下文和环境变量了 。第四行退出这个批处理文件 , 这是为了关掉命令行窗口 。此处不必理会 deactivate 文件 , 毕竟 VS Code 退出后,虚拟环境相关的环境变量就没有了 。
当我们要用 PySide 6 时,直接运行批处理文件就完事了 。
===================================================================================
PySide 6 的各种类型、模块与 C++ 版本是一样的 , 只要你会写 Python 代码,基本上可以直接迁移 。当然,千万不要像官方文档那样迁移,因为文档的 Python 代码估计是通过机器翻译的,直接将 C++ 译成 Python 。所以,你会看到官方文档有很多 Python 代码是错的,根本不能运行 。有的连语法都保留了 C++ 特征,压根就不是 Python 代码 。
尽管不能直接把 C++ 代码转换成 Python 代码,但是按照 C++ Qt 程序的思路来写代码是没问题的 。由于编程语言差异性,是不可能完全兼容的 。比如,C++ 版中的许多宏,你不能在 Python 中使用 。假如你要从 QObject 类派生,为了使其支持信号和槽 , 要加上 Q_OBJECT 宏 。在 Python 中不需要加,也没有这个,官方封装的库会帮我们完成这个 。再如,C++ 中重载的运算符 <<、>> 也不能用,PySide 中没有 QDebug 。
在 VS Code 中,解析器选择咱们上面创建的虚拟环境 。然后新建一个代码文件,名字随便取 。写个简单程序试试 。
# 导入要用到的类型from PySide6.QtCore import Qtfrom PySide6.QtWidgets import QApplication, QWidget# 自定义类,作为窗口class MyWindow(QWidget):# 构造函数def __init__(self, parent = None):super().__init__(parent, Qt.Window)# 设置窗口标题self.setWindowTitle("智能掏粪机")# 设置窗口大小self.resize(260, 185)#-------------------------------------------------if __name__ == '__main__':# 先实例化 app 对象app = QApplication()# 再实例化窗口类对象win = MyWindow()# 显示窗口win.show()# 启动消息循环app.exec()最后启动应用程序的代码也可以这样写:
if __name__ == '__main__':import sys# 先实例化 app 对象app = QApplication(sys.argv)# 再实例化窗口类对象win = MyWindow()# 显示窗口win.show()# 启动消息循环sys.exit(app.exec())

推荐阅读