Python和QML(Qt-Quick)搭配得好吗?

32 投票
3 回答
21427 浏览
提问于 2025-04-17 19:04

我刚开始学习Qt-Quick。对Qt这个QML的基础不太了解。而且我也不太熟悉C++,这是Qt和QML主要支持的语言。我知道JavaScript可以在QML层面做很多逻辑处理。但是如果需要和操作系统进行交互,就必须使用一些基础语言。因为我对Python比较熟悉,所以我打算使用QML-JS-Python的组合。

所以,我有几个问题:

  1. 对于高级应用和游戏开发,Python和Qt-Quick能搭配得好吗?
  2. 我的这个组合(QML-JS-Python)足够好吗?
  3. 我需要学习Qt来开发应用,以便让Python和QML连接起来吗?
  4. 如果是的话,那我应该学习完整的Qt,还是只学那些作为Python和QML之间沟通的几行代码就可以了?

如果我问的问题有点傻,抱歉。不过我想听听大家的建议和看法。

编辑:这个QML-JS-Python组合有什么限制吗?

提前谢谢大家!

3 个回答

0

1. 对于高级应用和游戏开发,Python和Qt-Quick的搭配效果好吗?

我不太明白为什么要用QT来做游戏开发,搭配Python的话可能会多此一举。
至于“高级应用”,我觉得Python会有很大帮助,因为你可以相对简单地创建动态内容。不过,有一点需要注意,PySide和qml的结合并不是特别好,虽然在PySide 6.3中有了很大进步,但相比C++来说,它的打磨和文档支持还是不够完善。而且,Python的API也不是特别符合Python的风格。


2. 我的组合三人组(QML-JS-Python)够用吗?

对于“高级应用”,我认为不够。
一旦你开始深入使用qml,你会发现需要一些自定义的组件,而这时你就需要用到C++,原因有两个:
A: 速度,Python在qml属性绑定中是个关键概念,如果你在Python中有很多属性,就会付出代价。
B: 正如我之前提到的,Python和qml的结合并不完整。你可以在之后为自己创建的C++组件制作自己的绑定,使用类似shiboken的工具。


3. 我需要学习Qt来开发应用,以便和Python通过QML连接吗?我应该学习完整的Qt,还是只学那几行作为Python和QML之间的沟通代码?

qml和qt-widgets有很多相似之处,但我觉得你可以直接从qml和qt-core开始学习。

7

截至2016年4月,PySide现在得到了Qt公司的官方支持。

它的官方网站在这里。LGPL许可证是一个选择,这似乎是这个项目最初创建的主要原因。

31

从概念上讲,Python、QML、JS和OpenGL结合得很好。我写过一个程序,把这些技术都融合在一起,效果不错。那是用的Qt4.7和PySide。

如果你只是使用QML,可以减少对Qt的接触(不过,了解更多总是有帮助的)。基本上,一旦你有了一个qdeclarativeview,除了处理信号和槽的部分,你的Qt工作就完成了,这在PySide下非常简单。我建议你可以快速上手,使用Python和QML,而不必过于担心Qt的细节,必要时再慢慢学习。

根据我的经验,我建议你在心里清楚区分Python和QML的角色。我把QML的使用限制在了界面逻辑上,它在这方面表现得很好;实际上,QML负责处理界面如何响应输入,然后将信号发送回主程序。这有点像在GUI和程序其他部分之间创建一个非常基础的接口,只传递高层逻辑(比如,不是直接发送点击事件,而是发送一个信号,比如“开始处理”,然后GUI负责如何显示这个变化)。在我的案例中,这直接和我的MVC框架连接,但你可以根据自己的需要来实现。

不过,这里有一个重要的警告。PySide的发展有些停滞,目前不支持Qt5及其所有QML的改进功能。虽然有很多讨论关于如何支持它,但实际上并没有很多代码被提交。

我相信PyQt支持Qt5,但它有双重许可,可以选择GPL或商业许可(而PySide是LGPL,可以与闭源代码一起使用)。我对PyQt没有经验,只知道PyQt和PySide大致可以互相替换。

看起来我在谈论使用它作为MVVM模式。

(关于任何限制的问题):PySide和PyQt都可以访问整个Qt。这意味着你可以像在C语言中那样用Python编写扩展。我写过一个小部件,捕捉鼠标滚动事件,这样我就可以从一个Flickable中获取滚动。这是一个在Python中创建的QML元素,不过我也必须从Python加载它;我没能弄明白如何创建一个可以在QML文档中加载的扩展。当然,也可以编写一个独立于主代码的C扩展,所以你始终有这个选择。

编辑:PySide2现在已经推出,并支持Qt5。

编辑2:截至2021年,Pyside现在被称为QT For Python,并且对QT6的支持非常好。记得留意许可协议。

撰写回答