在概念层面上,它们很好地结合在一起。我编写了一个 python/qml/js/opengl 程序,它很好地结合了所有内容。那是 Qt4.7 和 PySide。
如果您只是使用 QML,您可以最大限度地减少您需要接触的 Qt 数量(尽管一如既往,更多的知识会让您变得更强大)。本质上,一旦你有了一个 qdeclarativeview,你的 Qt 工作就可以在信号/槽处理之外完成,这在 PySide 下是一种乐趣。我建议您可以使用 Python 和 QML 快速提高工作效率,而不必过多担心 Qt 方面的问题,并根据需要选择它。
根据经验,我建议在你自己的脑海中明确 Python 和 QML 之间的界限。我将 QML 限制在 GUI 逻辑上,它做得很好;实际上,QML 处理接口如何响应输入,然后将信号发送回主程序。它的工作方式有点像在 GUI 和程序的其余部分之间创建一个非常基本的、精简的接口,只发出高级逻辑信号(而不是,例如,发回点击,它会发回一个信号,例如“打开处理”,GUI 将处理如何呈现该更改)。就我而言,这只是直接插入到我的 MVC 框架中,但您可以按照自己的喜好进行操作。
尽管如此,有一个很大的警告。PySide 的开发相当停滞,目前不支持 Qt5 及其所有 QML 改进优点。关于应该如何支持它已经有各种讨论,但没有多少实际代码提交。
我相信 PyQt 支持 Qt5,但作为 GPL 或商业双重许可(PySide 是 LGPL,因此可以与封闭源代码一起使用)。我没有 PyQt 的经验,除此之外,PySide 几乎是一个替代品。
好像我在谈论将其用作MVVM。
(任何限制问题):整个 Qt 通过 PySide 和 PyQt 暴露出来。这意味着您可以像在 C 中一样在 Python 中编写扩展。我编写了一个捕获鼠标滚动事件的小部件,因此我可以从 Flickable 中窃取滚动。这是一个用 Python 创建的 QML 元素,尽管我也必须从 Python 加载它;我不太清楚如何创建一个可以从 QML 文档中加载的扩展。当然可以编写一个独立于主代码的 C 扩展,因此您仍然可以选择。
编辑:PySide2现在是一个东西并支持 Qt5。
Edit2:截至 2021 年,Pyside 现在被称为QT For Python,并且在 QT6 之前得到了极大的支持。请务必记下许可证。