使用Qt.qy进行开发

这篇文章旨在介绍Qt.py项目,以及如何配置完成用于PySide / PyQt4和PySide2 / PyQt5开发。

原文链接


Qt.py是什么?

Qt.py是一个简约的 Python 2 & 3 库,用来动态调用所有的Qt绑定 - PySide,PySide2,PyQt4和PyQt5 - 它使您能够在编写软件时,动态选择可用的最可取的Qt绑定。

基本上,这意味着你需要导入PySide时,你可以导入Qt.py Python模块例如:

import Qt

这样,你可以导入全部的PySide模块,例如要导入QtGuiQtCore,那将可以这样使用:

from Qt import QtGui, QtCore

在你没有明确指定调用PySide或者PyQt时,如果你的代码遵循Qt.py的规则,无论你安装了PySide还是PyQt,你的代码都可以运行。Qt.py将检测你安装了那些python的Qt绑定,并去使用它。

请注意,你可以通过设置QT_PREFERRED_BINDING环境变量来设置Qt.py调用的首选偏好。

当使用Qt.py时,你必须遵循某些规则来使你的代码工作。例如,如果你要编写PySide2的代码,那么你需要如下的编写:

import sys
from Qt import QtWidgets

app = QtWidgets.QApplication(sys.argv)
button = QtWidgets.QPushButton("Hello World")
button.show()
app.exec_()

无论你是在WindowsmacOS还是LinuxPython 2Python 3PySidePyQt4PySide2PyQt5上使用Qt.py,上述代码都可以成功运行。

在新的Qt5的python绑定(PySide2PyQt5)中,QtGui的所有窗口小部件类被移动到QtWidgets这个类当中。我敢说,这是最大的向后兼容性的突破变化之一,你不得不去使用Qt.py对你现有的代码进行处理。

当然,在这些Qt的python绑定之间会有不同的差异,Qt.py并不会完全处理。当你遇到问题的时候,你可以查询正在使用的Qt绑定,并为这种情况创建针对性的特定的代码,例如,当涉及到Qt4Qt5的时候:

from Qt import __binding__

if __binding__ in ('PySide2', 'PyQt5'):
    print('Qt5 binding available')
elif __binding__ in ('PySide', 'PyQt4'):
    print('Qt4 binding available.')
else:
    print('No Qt binding available.')

有关更多的如何将你旧的基于PySide/PyQt4的脚本转化为基于Qt.py工作环境的更多内容,请查询作者之前的一篇帖子Dealing with Maya 2017 and PySide2

Qt.py是由Marcus Ottosson和作者Fredrik Averpil创建和维护的。在作者写这篇文章的时候,Qt.py已经被Disney Animation,Framestore,Industriromantik(作者在这工作),以及Weta Digital这几家公司所使用中。


它是如何工作的?

简而言之,Qt.py在Python脚本运行过程中,将Python环境中,可以用的(或者首选的)Qt的Python绑定来替换自己。但是,Qt.py将首先处理调用的重新映射,以便与PySide2的Qt5样式语法得以工作,即便你在使用Qt4的Python绑定的环境下运行这些代码。一些增强功能,如自动为PyQt4启用sip API V2功能并提供其他方便的功能也是Qt.py的特性,以便于提高不同的Qt绑定之间的代码兼容性。

更多的相关信息请参阅此项目中的README

此完整的Python模块包含在Qt.py文件中,作者建议阅读它,以增加对Qt.py的工作原理的理解。作者认为它实际上并不是那么大,也并不是那么复杂。


安装Qt.py

首先,在安装之前,请确保你已经在你的python环境中安装了PySide,PySide2,PyQt4或者PyQt5。然后再继续安装Qt.py。

其中最关键的部分在于确保你的脚本可以找到Qt.py。有很多方案可以来实现这一点,但是下面两个步骤可能是最简单的一种:
1. 下载Qt.py然后存放在你想存放的位置。
2. 添加刚刚的文件夹路径到PYTHONPATH环境变量中。

作者还概述了一些高级(通常更好)的方法,如何根据不同的需求来安装Qt.py安装请参阅:Installing Qt.py (advanced methods)


注意

这里有些"陷阱"或者些需要注意的事项。我们会保持更新在CAVEATS.md文件中。

这个CAVEATS.md文件实际上是以这样的方式创建的,即它可以被解析并包含在项目中的Travis-CI tests测试中.这使我们能够更好地更新和记录需要注意的事项及找到其解决方法。

我们鼓励所有使用Qt.py的人报告任何此类警告以及解决方法(如果可用),以便它们可以被纳入CAVEATS.md中来和参与我们的测试。


为项目做贡献

如果你想为项目做贡献(通常,这意味着贡献Qt.pyCAVEATS.md以及tests.py),你可以fork这个存储库。 然后在你的fork中进行更改,最后创建一个pull请求。

我们很乐意为你提供测试请求。当进行pull请求时,Travis-CI将自动尝试运行tests.py文件中指定的测试。每个测试都将与其他测试隔离运行。 如果你不想为自己的分支启用Travis-CI,可以使用Docker容器来运行测试。 我建议使用这种方式,因为它比等待Travis快得多。 在README的开发者部分阅读更多。

如果你的pull请求并没有立即被接受,请不要怪罪。 我们时常会审查pull请求,以确保它们对广大的用户群有价值。 有时我们在开发过程中走到了交叉口,需要决定Qt.py到底要走向何方。 这有时需要一些不断的回滚。永远不要忘记我们非常感激你花费了时间了来做一个pull请求,这将会使Qt.py变得更加好!

如果您有任何问题,请随时点击此处。 我们很想期待你对Qt.py的看法。


关于使用Qt.py的最后一点看法

关于PySide2的未来

这是PySide2的新官网,因为Qt公司接管了这个项目的开发。 再次可以留意它的最新状态和公告。 在此我可以看到PySide2不支持OpenGL。

PySide2在最近的开发中采取了强硬的转变,并宣布他们不会支持Python 2(虽然这并不是正式的公告,然而我听说了这样的消息)。 只要使用适当的编译器,PySide2然而还是有希望能与Python 2兼容的。并且在之前发布的Maya 2017中包含了Python 2以及PySide2,所以前面的猜测可能是正确的。 从PySide2 wiki在Github中得到这样的消息:

> ###为什么没有Python 2的PySide2?
因为Python 2扩展如PySide需要编译比较古老的MS Visual C++ 9 版本,这意味着所有链接的libs包括Qt都需要需要编译这个版本。 但是Qt5,PySide2包装的库,放弃了对Visual C++ 9的支持,并且代码不太可能使用它进行编译。 目前解决这个问题的唯一解决方案就是帮助开发和资助https//mingwpy.github.io/

由于PySide2有这么多的不确定性,并且还因为PyQt5可以通过pip直接进行安装,我个人打算将在任何可以使用Python 3PyQt5的地方使用PyQt5。 然后我现在还在使用PySide2,例如在Autodesk Maya 2017以及PySideMaya的早期版本当中。

QtQuick 和 PyQt4

即使QtQuick在PyQt4中可以使用,我还是不打算在PyQt4中使用它,并只在PyQt5使用QtQuick,在那里显然它能工作的更好。