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

13

当您使用Qt编写应用程序时,它是否可以直接在不同的操作系统上运行?而且(如果我理解不正确,请纠正我)您不需要在想要执行应用程序的所有不同平台上都安装Qt吗?

这是如何实现的?Qt是针对所需平台进行编译还是捆绑了一些“dlls”(库),或者它是以其他方式实现的?与编写跨平台运行的Java应用程序有何不同?

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


2
两个当前的答案都忽略了提供这个链接,所以我来补充一下: http://doc.qt.nokia.com/4.7-snapshot/deployment.html 它详细介绍了如何在所有平台上部署(以及可能需要的一些编译设置)。但是它仍然需要在您想要运行它的每个平台上进行编译。 - Adam W
大卫:我认为 Python 是字节编译的。这就是为什么它会生成这些 *.pyc 文件,我可以删除 *.py 文件,它仍然可以运行,对吗?它只是不像 Java 那样需要显式调用编译器。 - Ken
1
David:我不知道你所说的“与pyc文件类型相关联”的意思——如果存在*.pyc,Python就不会去寻找*.py。而且这种区别听起来纯粹是词汇问题:Java的运行时称为“VM”,而Python的运行时称为“解释器”,尽管它们都在执行字节码。当我们的术语更多地基于历史偶然而不是今天的事情时,人们感到困惑也就不足为奇了。 :-) - Ken
我更新了英文用法。 :-) - Warren P
@Warren P:谢谢,英语不是我的母语,我写帖子的速度很快。在你的编辑之后,它确实好多了。(还有@Evan Plaice,我不是“印度人”,这样发表评论也没有任何帮助。对不同文化/国家的偏见并不是一件好事。 :)) - Somebody still uses you MS-DOS
显示剩余4条评论
3个回答

15

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

对于您的最后一个问题,用户需要Python、Qt库和绑定库(例如pyqt),但有各种打包方式可供选择。


那么,如果不进行捆绑,我需要安装一个(仅举例)4mb的文件,而捆绑所有内容则需要40mb左右 - 就像捆绑Java本身一样。我说得对吗? - Somebody still uses you MS-DOS
1
不知道确切的数字,但基本上是正确的。如果您知道用户已经拥有正确的Qt动态库,则无需捆绑它们。 - Matthew Flaschen

13

PyQT [以及其开源的同类 PySide] 是一个非常棒的跨平台 QT 绑定库,可以用于 Python 编程语言,但是它并不是一个能够让你在所有平台上轻松打包安装程序的魔法解决方案。也许你期望有些魔法般的效果。

QT 是一个使用 C++ 编写的跨平台库。这意味着你只需要编写一次 C++ 或 Python 代码(或使用其他支持 QT 的语言),然后创建一个“窗口”(如一个表单、对话框或屏幕上的其他组件),并为其添加控件(如按钮等),而无需考虑在 Windows、Linux 和 macOS 上制作按钮时存在的平台差异。

由于 QT 是一个库,因此它可以以多种方式进行打包。它可以被“静态链接”(即构建到您的可执行文件/二进制文件/应用程序中),也可以被“动态链接”(在 Windows 中称为 DLL,在 Unix/Linux 中称为共享库,在 macOS 中称为框架)。除非它是一个共享库,否则它不总是被“安装”到计算机上。

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

如果您使用 QT 的 Python 绑定库,那么您的应用程序安装包需要包含 QT 绑定的二进制文件(Python 扩展)、基本的 Python 运行时环境(包括 Python 可执行文件和基本库)以及您程序的源代码。这些可以打包成一个单独的“包”。例如,在 macOS 上,这一切都可以轻松地打包到一个“.app”包中,在 Windows 和 Linux 上,我相信有打包和安装工具可以帮助您轻松完成此项任务。

即使您只需编写一次应用程序的用户界面代码,也不能通过魔法般的方式在所有三个主要平台上同时发布应用程序,而不必至少为每个平台分别构建安装程序或打包程序。用户期望为 Windows 或 macOS 下载设置/安装包,对于 Unix/Linux,则取决于您安装的发行版。

感谢AdamW提供的Nokia链接,提供了有关部署信息的更新


1
Warren,非常感谢您在许多方面提供了澄清的答案。我之所以问这个问题,是因为我正在考虑一个Python应用程序,并考虑跨平台,但我对桌面编程(主要是Web开发)还很陌生。我研究了GTK、Qt和Appcelerator,并试图真正理解它们各自提供的功能,以便确定哪种解决方案最适合我。 - Somebody still uses you MS-DOS
Python在语言方面具有巨大的优势(易于学习和强大),但Python中一个极其分散的领域是“哪种GUI?”问题。你应该考虑使用WxWidgets的Python绑定。有些人说,如果TkInter(tcl/tk)gui(我认为很糟糕)没有首先发布,那么WxPython将成为默认的Python GUI。它还处理Windows、Mac和Linux,并拥有庞大的活跃社区。 - Warren P
@有人 如果你正在寻找一个像HTML/CSS一样跨平台、不受编程语言限制的标记文件,用于QT,请务必查看QML。 - Evan Plaice
QML是QT的XAML等效物吗? - Warren P

5
问题在于你对“已安装”的定义。为了使Qt工作,可执行文件只需要访问正确的库即可。
当然,对于每个平台,都必须生成不同的可执行文件和库(请参阅 Qt文档)。
关于Python,如果要运行Python可执行文件,您必须以更传统的方式进行安装。除非您在Windows上使用py2exe等工具。

那么,Qt会自动处理这些库的所有事情吗?我创建了一个跨平台应用程序,想在Linux和Windows上部署它,Qt能以透明的方式捆绑这些库吗? - Somebody still uses you MS-DOS
不,Qt 只提供了一种方法来生成不同平台上运行的不同二进制文件。你仍然需要为每个平台提供不同的二进制文件/安装程序。你可以使用单个安装程序来检测平台并安装适当的版本,但我没有看到这种方法有任何好处。 - Vinko Vrsalovic
我的错,我知道这会创建不同的二进制文件。我只是想知道Qt是否会为我创建它们。 - Somebody still uses you MS-DOS
@有人仍在使用MS-DOS - Qt不会为您创建其他二进制文件(尽管它带有一个多平台的make替代品),它只是具有一组函数调用,以执行所有在所有平台上都相同的平台特定操作(例如gui / filesystem)。然后,您只需将Qt库捆绑到您要针对的平台上即可。 - Martin Beckett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接