Qt 是如何工作的(确切地说)?

Posted

技术标签:

【中文标题】Qt 是如何工作的(确切地说)?【英文标题】:How does Qt work (exactly)? 【发布时间】:2010-06-15 13:49:18 【问题描述】:

当您使用 Qt 编写应用程序时,它可以立即在不同的操作系统中运行吗?而且(如果我错了,请纠正我)您不需要在要执行应用程序的所有不同平台上都安装 Qt?

这究竟是如何工作的? Qt 是否编译到所需的平台,或者它是否捆绑了一些“dll”(库),或者它是如何做到的?它与编写跨平台的 Java 应用程序有什么不同吗?

如果您使用 Python 编写带有 Python 绑定的 Qt 应用程序,您的最终用户是否需要安装 Python?

【问题讨论】:

当前的两个答案都忽略了提供此链接,所以我会:doc.qt.nokia.com/4.7-snapshot/deployment.html 它详细说明了如何在所有平台上部署(以及您可能需要的一些编译设置)。但它仍然需要在您想要运行它的每个平台上进行编译。 您在评论 py2exe,Linux 是否存在类似的东西? @David:我的意思是库(需要为每个平台编译或下载),但是是的,你是对的 :) David:我认为 Python 是字节编译的。这就是它制作这些 *.pyc 文件的原因,我可以删除 *.py 文件并且它仍然运行,不是吗?它只是不需要我像 Java 那样显式调用编译器。 David:我不知道您所说的“与pyc 文件类型相关联”是什么意思——如果存在 *.pyc,Python 根本不会费心寻找 *.py。区别听起来像是纯粹的词汇问题:Java 的运行时称为“VM”,而 Python 的运行时称为“解释器”,尽管它们都在执行字节码。难怪人们会感到困惑,因为我们的术语更多地基于历史事故而不是今天的事情。 :-) 【参考方案1】:

Qt(理想情况下)提供源代码兼容性,而不是二进制兼容性。您仍然需要为每个平台单独编译应用程序,并使用相应的动态 Qt 库(也需要单独编译,并具有一些特定于平台的代码)。

对于您的最后一个问题,用户需要 Python、Qt 库和绑定库(例如 pyqt),但有多种方法可以捆绑这些。

【讨论】:

所以,如果不捆绑它们,我将有一个(只是一个例子)一个 4mb 的文件来安装,并捆绑所有类似 40mb 的东西——就像捆绑 Java 本身,如果它是 Java 的话。我说的对吗? 不知道确切的数字,但基本上是对的。如果您知道用户已经拥有正确的 Qt 动态库,则不必捆绑它们。【参考方案2】:

PyQT [和它的开源表亲 PySide] 是一个很棒的 python 跨平台 QT 绑定,但它不是一个神奇的解决方案,可以在不进行任何打包/安装程序维护的情况下为所有平台发布您的应用程序。我想你可能会期待一些魔法。

QT 是一个用 C++ 编写的跨平台库。这意味着,您可以编写一次 C++ 或 Python(或具有绑定的其他语言)代码,然后创建一个“窗口”(一个表单、一个对话框、屏幕上的某些东西)并用控件(按钮和所有这些)填充它) 并且不必处理在 Windows、Linux 和 Mac OS X 上如何制作按钮的平台差异。

因为它是一个库,所以可以多种方式打包。它可以是“静态链接”(内置在您的可执行文件/二进制文件/应用程序中)或“动态链接”(在 Windows、共享库或 unix/linux 上或作为框架,在 mac os x 中称为 DLL)。它并不总是“安装”在计算机上,除非它是共享库。

即使它被“安装”到计算机上,该计算机上也可能存在多个版本,因此将其视为计算机的扩展是不恰当的,而是将其视为应用程序的扩展(一个程序) 在您的计算机上。

如果您为 QT 使用 Python 绑定,那么您的应用程序的安装包需要包含 QT 绑定的二进制文件(python 扩展)、基本的 Python 运行时环境(包括 Python 可执行文件和基本库)以及程序的源代码。可以将其中的大部分打包成一个“捆绑包”。例如,在 Mac OS X 上,所有这些都可以轻松放入“.app”包中,而在 Windows 和 Linux 上,我相信有一些打包和安装工具可以帮助您轻松做到这一点。

即使您只需要为您的应用程序编写一次用户界面代码,您也不会神奇地获得一次在所有三个主要平台上发布应用程序的能力,而无需至少构建安装程序或打包,分别针对每个平台。用户希望下载适用于 Windows 或 Mac OS X 的设置/安装包,而对于 Unix/Linux,它可能进一步取决于您安装的发行版。

Update thanks to AdamW for this nokia link providing deployment information

【讨论】:

沃伦,感谢您在这么多层次上的澄清答案。我问这个问题是因为我正在考虑一个 Python 应用程序,并考虑过跨平台,但我是桌面编程的新手(我主要开发 Web)。我使用了 GTK、Qt 和 Appcelerator,我试图根据它们提供的功能真正了解哪些解决方案对我来说是理想的。 Python 在语言方面为您提供了巨大的好处(易于学习且功能强大),但 Python 的一个非常分散的领域是“哪个 GUI?”问题。您可能还应该考虑 WxWidgets 的 Python 绑定。有人说,如果没有首先发布 TkInter (tcl/tk) gui(我认为这是垃圾),那么 WxPython 将是默认的 Python GUI。它还处理 Windows、Mac 和 Linux,并拥有一个庞大的活跃社区。​​span> @Somebody 如果您正在寻找与 QT 的 HTML/CSS 等跨平台语言无关的标记文件,请务必查看 QML。 QML 是 QT 的 XAML 等价物吗?【参考方案3】:

问题在于您对“已安装”的定义。要使 Qt 工作,可执行文件只需要访问适当的库即可。

当然,必须为每个平台生成不同的可执行文件和库(请参阅Qt docs)。

关于 Python,如果您要运行 Python 可执行文件,则必须安装它(以更传统的方式)。例如,除非您在 Windows 中使用 py2exe 运行。

【讨论】:

那么,对于我部署应用程序的每个平台,Qt 是否会为我处理这些库的所有事情?我创建了一个跨平台的,并且想在 Linux 和 Windows 上部署它,它是否以透明的方式捆绑了这些库? 不,Qt 只是提供了一种从相同源生成不同二进制文件的方法,这些文件将在不同平台上运行。您仍然必须为每个平台提供不同的二进制文件/安装程序。您可以使用一个安装程序来检测平台并安装正确的版本,但我看不出这种方法有什么好处。 我的错,我知道它会创建不同的二进制文件。我只想知道 Qt 是否为我创建了它们。 @Somebody 仍然使用你 MS-DOS - Qt 不会为你创建其他二进制文件(尽管它确实带有 make 的多平台替换)它只是有一组函数调用做所有平台上相同的所有平台特定的东西(如 gui/文件系统)。然后,您只需为您的目标平台捆绑 Qt 库,

以上是关于Qt 是如何工作的(确切地说)?的主要内容,如果未能解决你的问题,请参考以下文章

Qt Quick - 如何仅通过 c++ 代码与 qml 属性交互

SVM 分类是如何工作的?

如何在 Graphics32 中检索 RenderText 的确切文本宽度

如何修复下载文件中没有数据[重复]

array[:] 在这个回溯算法中,或者更确切地说在 Python 中到底做了啥?

map-reduce 如何在 HDFS 与 S3 上工作?