PySide
简介
PySide库是跨平台图形用户界面(GUI)工具包Qt的Python封装。FreeCAD使用Qt作为其主要的GUI工具包。Qt本身不仅仅是一个GUI工具包,它是一个包含多种用途的C++库的集合,例如可以使用Qt库组件进行网络编程,所有这些都可以通过PySide在Python中访问。任何可以用C++创建的图形界面,同样可以用Python创建和修改。使用Python的一个优势是,Qt界面可以实时开发和测试,因为我们不需要编译源文件。
在FreeCAD中导入PySide(任何版本)的推荐方式是:
from PySide import QtCore, QtGui, QtWidgets
Qt & PySide 版本
- Qt 1.0版本于1990年代中期发布
- Qt 4.0版本于2005年发布,4.x系列于2015年正式退役
- Qt4.x的Python封装名为PySide
- Qt 5.0版本于2012年发布,5.x系列于2020年正式退役。
- Qt5.x的Python封装名为PySide2
- Qt 6.0版本于2020年发布,是当前版本系列
- Qt6.x的Python封装名为PySide6
使用PySide创建的示例。左:一个简单的对话框。右:一个包含图表的更复杂的对话框。
FreeCAD 和 PySide
FreeCAD最初的理念是将Cas.CADE(几何内核)、Qt(GUI工具包)和Python结合在一起,创建一个带有内置脚本引擎的免费3D参数化CAD程序。这发生在2000年代初期,即PySide出现之前,因此在FreeCAD的前十年里使用的是另一个封装——PyQt。PySide的出现是为了解决PyQt的许可问题,FreeCAD在2013年完成了向PySide的切换(commit 1dc122dc9a)。
如果您想了解您的安装使用的是哪个Qt版本,关于对话框中有包含Qt的版本列表。
更多信息请参阅:
当您安装FreeCAD时,您将同时获得Qt和与之匹配的PySide,作为软件包的一部分。如果您正在自行编译,则必须验证这两个库的匹配版本已安装,以便FreeCAD正确运行。当然,PySide仅在Qt存在的情况下才能工作。
多版本兼容性
PySide与后续的PySide2和PySide6库之间的主要区别在于命名空间。PySide(Qt4)具有主要的命名空间QtGui和QtCore,而PySide2(Qt5)和PySide6(Qt6)引入了额外的命名空间QtWidgets,所有控件现在都位于其中,它们以前位于QtGui命名空间中。
FreeCAD处理不同版本的Qt/PySide的方式是将它们都称为PySide,这实际上应该被视为PySideX。无论安装的是哪个Qt/PySide版本,它们都通过PySide导入。
一个shim处理版本之间的差异。这个PySide shim位于为Qt5/Qt6编译的FreeCAD安装目录的Ext/目录中。
/usr/share/freecad/Ext/PySide
该模块只是从PySide2/6导入必要的类,并将它们放入PySide命名空间中。之所以选择这种方法,是因为它能够从Qt4的角度提供向后兼容性。
PySide2.QtCore -> PySide.QtCore
PySide2.QtGui -> PySide.QtGui
PySide2.QtWidgets -> PySide.QtWidgets
PySide2.QtSvg -> PySide.QtSvg
PySide2.QtUiTools -> PySide.QtUiTools
因此,PySide2.QtWidgets类也被放置在PySide.QtGui命名空间中。
PySide2.QtWidgets.QCheckBox -> PySide.QtGui.QCheckBox
但目前推荐的方式是使用现代的命名空间。
from PySide import QtCore, QtGui, QtWidgets
my_check_box = QtWidgets.QCheckBox()
PySide使用示例
- PySide 初级示例,hello world, 公告,输入文本,输入数字。
- PySide 中级示例,窗口大小调整、隐藏小部件、弹出菜单、鼠标位置、鼠标事件。
- PySide 高级示例,众多小部件。
PySide示例分为3个部分,根据对PySide、Python和FreeCAD内部机制的接触程度进行区分。第一个页面包含PySide的概述;第二个和第三个页面主要是不同级别的代码示例。
期望这些示例对入门有所帮助,之后用户可以查阅在线的其他资源,或官方文档。
文档
不同版本之间在控件处理方面存在一些差异。程序员应该了解这些不兼容性,并在特定平台上某些功能未按预期工作时查阅官方文档。虽然不常见,但有时可能需要通过if语句进行版本化调用。
PySide文档指的是Python风格的类;然而,由于Qt最初是一个C++库,相同的信息应该可以在相应的C++参考文档中找到。
- Qt Modules PySide2/PySide6 (Qt5/Qt6) 可用的模块。
- All Qt classes by module Qt5中按模块分类的所有C++类。
- Qt Modules PySide (Qt4) 可用的模块。
- FreeCAD scripting: Python, Introduction to Python, Python scripting tutorial, FreeCAD Scripting Basics
- Modules: Builtin modules, Units, Quantity
- Workbenches: Workbench creation, Gui Commands, Commands, Installing more workbenches
- Meshes and Parts: Mesh Scripting, Topological data scripting, Mesh to Part, PythonOCC
- Parametric objects: Scripted objects, Viewproviders (Custom icon in tree view)
- Scenegraph: Coin (Inventor) scenegraph, Pivy
- Graphical interface: Interface creation, Interface creation completely in Python (1, 2, 3, 4, 5), PySide, PySide examples beginner, intermediate, advanced
- Macros: Macros, How to install macros
- Embedding: Embedding FreeCAD, Embedding FreeCADGui
- Other: Expressions, Code snippets, Line drawing function, FreeCAD vector math library (deprecated)
- Hubs: User hub, Power users hub, Developer hub

