【问题标题】:Does Python go well with QML (Qt-Quick)?Python 是否与 QML(Qt-Quick)配合得很好?
【发布时间】:2013-03-02 14:36:58
【问题描述】:

我是 Qt-Quick 的初学者。 我不知道 Qt 是 QML 的基础。 而且我也不熟悉 C++,它又是 Qt 和 QML 的主要支持语言。 我知道 JS 可以在 QML 层本身做很多逻辑。但是如果我们需要与操作系统交互,那么我们必须使用一些基础语言。由于我对 Python 很熟悉,我正在计划“QML-JS-Python”组合。

所以,我的问题:

  1. 对于高级应用程序和游戏开发,Python 和 Qt-Quick 是否齐头并进?
  2. 我的组合三重奏 (QML-JS-Python) 是否足够好?
  3. 我是否需要学习 Qt 进行应用程序开发才能从 QML 与 Python 耦合?
  4. 如果 Qust 3 是,那么我应该学习完整的 Qt 还是只学习作为 Python 和 QML 之间通信门的那几行代码?

对不起,如果我提出这些问题是愚蠢的。但我愿意接受建议和意见。

编辑:此组合 QML-JS-Python 的任何限制

提前致谢

【问题讨论】:

  • 你为什么不把它留给 JS - 一种动态语言就足够了,而且 JS 的性能比 Python 更好。对于 Qt,您需要 C++ 来扩展 QML 和 JS 以将 QML 组件绑定在一起。在这种情况下,Python 是一个多余的工具。
  • 可以使用 python 组件扩展 QML。根据冗余参数,除了汇编程序之外的所有语言都是冗余的。 JS 和 Python 显然不是等价的。在 QML 之外拥有严肃的程序逻辑可能是一件非常好的事情。
  • @ddriver,正如我在问题中提到的,要针对某些特定问题与操作系统建立通信,我们需要一些基础语言。所以,我更喜欢 Python,因为我不太熟悉。

标签: python qml qt-quick


【解决方案1】:

在概念层面上,它们很好地结合在一起。我编写了一个 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 之前得到了非常多的支持。请务必记下许可证。

【讨论】:

  • 从专业经验来看,我想补充一点,虽然 PySide 很好用,但它有一些值得注意的漏洞,可能会在你最意想不到的时候弹出并让你措手不及。困扰我的一个值得注意的问题是无法在 Python 中创建可以使用正常信号连接逻辑并传入命名参数的信号。您必须使用 hack 并始终通过 javascript 连接到这些信号才能访问处理函数中的参数。基本上经过几个月的开发,由于各种问题,我们真的希望我们使用 C++。
  • 我会说有一些障碍,但它们不是无法克服的障碍。我遇到的唯一几个困难是在从 QML 到 python 的层之间传递数据。如果您打算进行复杂的转换,那么使用 C++ 会容易得多。如果之间传递的数据保持简单,或者如果您以序列化形式传递事物,则使用 Python 非常方便。 tldr;如果您打算与 Qt 后端进行大型复杂交互,从长远来看,您可能最好使用 C++。
  • 我认为问题在于 UI 逻辑与业务逻辑的分离程度。无论如何,确保它是好的纪律可能是好的。这可能是一种心态问题,如果你假设你将在 QML/js 中做 UI 的东西,并且只在必要时与后端通信,你应该能够很好地工作。跨度>
  • 请注意,PySide 是官方选择的 Qt 支持绑定。考虑到发生的一切,我不确定这有多重要,但最后我检查了使用 PySide 而不是 PyQt 更可取。
  • 伤心!仍然要注意 PySide 是 LGPL,而您可能需要为 PyQt 的商业许可证付费,除非您愿意接受他们要求您开源所有代码的其他许可证之一。这适用于个人项目,但企业可能会遇到问题。
【解决方案2】:

截至 2016 年 4 月,PySide 为 now,由 Qt 公司正式支持。

官方主页是here。 LGPL 许可是一种选择,这似乎是最初创建该项目的主要原因。

【讨论】:

    猜你喜欢
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2011-06-08
    • 2011-01-18
    • 1970-01-01
    • 2010-09-11
    相关资源
    最近更新 更多