1

我想知道像 Qt Jambi 和 PyQt 这样的 Qt 语言绑定是否已经实现了所有的 Qt 模块。即它们是否只是将目标语言(JAVA、python、...)与 Qt C++ 模块相结合的一种方式,或者目标语言与用目标语言实现的模块一起工作。

例如,一个简单的问题是:Qt Jambi 是否可以与用 Java 编写的 Qt 模块一起使用?(如果是,我们是否可以编写能够在不同平台上运行的 Qt Jambi 应用程序?即所有 Qt Jambi 模块都是 jar 文件吗?)

4

2 回答 2

2

就 PyQt 而言,它是否“实现了所有 Qt 模块”的答案是:是和否。但大多没有。

PyQt 使用SIP工具来生成它的绑定。如果您想了解这是如何完成的,以下是 PyQt 和 SIP 的作者如何解释该过程:

对于 PyQt v4,我使用了一个名为 metasip 的内部工具(当然是使用 PyQt 编写的)。这是一种用于 SIP 的 IDE。它使用 GCC-XML 解析最新的头文件并将相关数据以 XML 格式保存在 metasip 项目中。然后,metasip 对 API 的先前版本进行等效的比较,并标记任何需要查看的更改。然后通过 GUI 进行这些更改并勾选 TODO 列表。生成 .sip 文件只需单击按钮。在我的 subversion 存储库中,PyQt v4 基本上只是一个 20M 的 XML 文件。为 Qt v4 的次要版本更新 PyQt v4 大约需要半个小时。

就生成代码的工作方式而言,我认为它与任何其他绑定生成器的工作方式没有太大不同。Python 有一个非常好的 C API 用于编写扩展模块——这就是为什么这么多 3rd 方工具都有 Python 绑定的原因之一。对于每个 C++ 类,SIP 生成的代码都会创建一个用 C 实现的相应 Python 类。

所以 PyQt 只是 Qt 模块周围的一组相当薄的包装器,通常不实现任何功能本身。但是,也有一些例外。

首先,PyQt 在各个地方添加了一些语法糖,以使 Qt API 更适合 Python 编码人员(例如,新样式的信号和槽支持)。

其次,由于 C++ 和 Python 之间的基本语言差异,有一些 Qt API 对 PyQt 提供是没有意义的(例如,没有任何东西相当于 Python 中的类型转换)。

最后是uic 模块。与 PySide 不同,PyQt 根本不包装QtUiTools模块。相反,它提供了一个用纯 Python 编写的模块,该模块实际上实现了 Qt 库中的等效功能。但这是例外,而不是规则。

除了上述之外,毫无疑问还有许多其他的差异和遗漏,我在这里没有提到(特别是关于 PyQt5)。与所有语言绑定一样,基本目标是提供两种语言之间的实用通信方式,而不是完美的一对一映射。

于 2014-03-16T19:01:21.353 回答
1

他们没有涵盖所有内容,没有。这是我以前的答案之一,表明 PySide 缺少一个类的包装。

在 Stack Overflow 上意识到它之后,我不得不手工制作它。一般来说,它高度依赖于特定 Qt 绑定的作者。其中一些覆盖得很好,但有些则暂时未维护。

至于您的 Qt Jambi 和 jar 问题,我不确定,但至少有一些代码级分离,您可以在此处看到。

于 2014-03-16T05:18:47.747 回答