在概念层面上,它们配合得很好。我编写了一个 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 http://en.wikipedia.org/wiki/Model_View_ViewModel.
(任何限制问题):整个 Qt 是通过 PySide 和 PyQt 公开的。这意味着您可以像在 C 中一样在 Python 中编写扩展。我编写了一个捕获鼠标滚动事件的小部件,这样我就可以从 Flickable 中窃取滚动。这是一个用 Python 创建的 QML 元素,尽管我还必须从 Python 加载它;我不太清楚如何创建一个可以从 QML 文档内部加载的扩展。当然,可以编写一个独立于主代码的 C 扩展,因此您仍然可以选择该选项。
Edit: PySide2 https://wiki.qt.io/Qt_for_Python现在已经有了并且支持Qt5。
Edit2:截至 2021 年,Pyside 现在被称为Python 的 QT https://www.qt.io/qt-for-python,并且一直支持到 QT6(包括 QT6)。请务必记下许可证。