我想知道Qt的语言绑定是否像Qt Jambi和PyQt一样实现了所有Qt模块。即它们是否只是将目标语言(JAVA,python,...)与Qt C ++模块相结合的一种手段,或者目标语言与使用目标语言实现的模块一起工作。
e.g。一个简单的问题是:Qt Jambi是否使用用Java编写的Qt模块? (如果是的话,我们可以编写能够在不同平台上运行的Qt Jambi应用程序吗?即所有Qt Jambi模块都是一些jar文件吗?)
答案 0 :(得分:2)
就PyQt而言,它是否已经实现了所有Qt模块的答案"是:是和否。但大多数没有。
PyQt使用SIP工具生成其绑定。如果你想了解这是如何完成的,下面是PyQt和SIP的作者如何解释这个过程:
对于PyQt v4,我使用内部工具(当然使用PyQt编写) 叫metasip。这是一种SIP的IDE。它使用GCC-XML 解析最新的头文件并将相关数据保存为XML 一个metasip项目。 metasip然后相当于差异 以前版本的API并标记需要的任何更改 看看。然后通过GUI进行这些更改并勾选 关闭TODO列表。生成.sip文件只需按一下按钮。 在我的subversion存储库中,PyQt v4基本上只是一个20M的XML文件。 更新PyQt v4以获得Qt v4的次要版本大约需要半个小时 工作
就生成的代码如何工作而言,我并不认为它非常 不同于任何其他绑定生成器的工作方式。 Python有一个 用于编写扩展模块的非常好的C API - 它是其中之一 为什么这么多第三方工具有Python绑定的原因。每一个 在C ++类中,SIP生成的代码创建了一个相应的Python类 在C中实施。
因此,PyQt只是围绕Qt模块的一组相当薄的包装器,并且通常不会实现任何功能本身。但是,有一些例外。
首先,PyQt在各个地方添加了一些语法糖,以使Qt API对Python编码器更加可口(例如,new-style signal and slot support)。
其次,由于C ++和Python之间存在基本的语言差异(例如,没有什么能与Python中的类型转换相提并论),因此有些Qt API对PyQt没有任何意义。
最后,有uic module。与PySide不同,PyQt根本不包装QtUiTools模块。相反,它提供了一个用纯Python编写的模块,实际上 实现了Qt库中的等效功能。但这是例外,而不是规则。
除了上述内容之外,我还没有其他许多差异和遗漏(特别是关于PyQt5)。与所有语言绑定一样,基本目标是在两种语言之间提供实用通信方式,而不是完美的一对一映射。
答案 1 :(得分:1)
他们没有覆盖所有内容,没有。这是my previous answers中的一个,表明PySide缺少一个类的包装。
在Stack Overflow上实现它之后,我不得不手工制作它。一般来说,它高度依赖于特定Qt绑定的作者。其中一些是很好的,但有些没有维持一段时间。
关于你的Qt Jambi和jar问题,我不确定,但至少有一些代码级别的分离,你可以在here中看到它。