为什么在创建QApplication实例时需要传递sys.argv

1,434 阅读4分钟

QApplication 对象是每个Qt Widgets应用程序的核心。每个应用程序都需要一个而且只有一个QApplication 对象来运作。这个对象启动并保持你的应用程序的主事件循环,它管理着所有用户与GUI的交互。

当用PyQtPySide开发应用程序时,你将创建一个QApplication 的实例,就像下面的例子一样,传入sys.argv 或一个空列表[]

  • PySide6
  • PyQt6

python

import sys
from PySide6.QtWidgets import QApplication

app = QApplication(sys.argv)
# or: app = QApplication([])

python

import sys
from PyQt6.QtWidgets import QApplication

app = QApplication(sys.argv)
# or: app = QApplication([])

虽然这很有效,但你可能会问自己:sys.argv 或空列表[] 的含义是什么,为什么要把它传给QApplication

什么是sys.argv

当你的应用程序启动时,sys.argv 包含用于启动应用程序的参数。如果你从命令行启动一个Python应用程序,sys.argv 将包含你的Python脚本文件的名字作为第一个条目。

argv 这个名字是参数向量的缩写。这个名字起源于C语言,"vector "是动态数组或list

例如,请看下面的命令行示例:

bash

python argtest.py

当执行这个脚本时sys.argv 将包含列表['argtest.py'] 。你在上面的命令末尾添加的任何内容都会被附加到sys.argv 上。

要看到这个动作,请创建以下简单的Python脚本,并将其保存为argtest.py

python

import sys
print("Arguments:", sys.argv)

现在,从命令行中运行你的argtest.py 脚本,并尝试传入你自己的参数。例如,下面的命令行。

bash

python argtest.py --info

...将输出...

bash

Arguments: ['argtest.py', '--info']

正如你所看到的,--info 命令行参数是从sys.argv 检索的,旁边是Python脚本的文件名。

命令行参数是以空格分割的, 所以任何用空格分隔的东西都会被当作一个新的参数.要传递包含空格的参数,需要用引号将其包起来。

当我们把sys.argv 传给QApplication 时,我们是把命令行参数传给Qt。这使得我们可以在应用程序启动时将任何配置设置传递给Qt

有哪些命令行参数可用?

Qt提供了一些内置的命令行参数,这些参数在PyQtPySide 中也是可用的。

Qt特有的命令行参数

  • --platform platformName[:options]指定Qt平台抽象(QPA)插件。这覆盖了QT_QPA_PLATFORM环境变量。

当在Raspberry Pi上开发应用程序时,这通常用于将Qt输出重定向到Linux帧缓冲设备(例如,一个自定义屏幕),而不使用XWindows。例如,-platform linuxfb:fb=/dev/fb1

  • --platformpluginpath path指定平台插件的路径。这覆盖了QT_QPA_PLATFORM_PLUGIN_PATH环境变量。

  • --platformtheme theme指定平台的主题。这将覆盖QT_QPA_PLATFORMTHEME环境变量。

  • --plugin plugin指定要加载的额外插件。插件的值可以被多次传递。这将与QT_QPA_GENERIC_PLUGINS环境变量中的插件相连接。

  • --qmljsdebugger value激活 QML/JavaScript 调试器,指定的端口作为value 传递。该值必须是 ,其中port:1234[,block]block是可选的,它将使应用程序等待,直到有调试器连接到它。

  • --qwindowgeometry geometry使用X11语法为主窗口指定一个几何图形,应该像--qwindowgeometry 100x100+50+50那样传递。

  • --qwindowicon icon设置一个窗口的默认图标。

  • --qwindowtitle title设置第一个窗口的标题。

  • --reverse 设置应用程序的布局方向为Qt.RightToLeft 。该选项旨在帮助调试,不应该在生产中使用。默认值是由系统的locale自动检测的。

  • --session session从一个较早的会话恢复应用程序。

一般命令行参数

  • -h 或 或 显示所有一般命令行参数的帮助,包括这个参数。注意, 参数只在 Windows 上可用。--help -? -?

  • --help-all 显示--help 所做的工作以及所有Qt特定的命令行参数。

  • -v 或 显示一个应用程序的版本。--version

我需要传递sys.argv 吗?

不需要。虽然传递sys.argv 允许你在应用程序启动时将命令行配置传递给Qt,但如果你不需要或想阻止从命令行配置Qt,你可以选择传递一个空列表[] (使用PyQt6PyQt5PySide2)或根本不传递(使用PySide6)。

python

# PyQt6

import sys
from PyQt6.QtWidgets import QApplication

app = QApplication([])
# PySide6

import sys
from PySide6.QtWidgets import QApplication

app = QApplication()

如果你不传递sys.argv ,你就不会把命令行参数转发给Qt。因此,你不能从命令行中定制Qt的行为。

结论

在启动时传递sys.argvQApplication 允许你从命令行中定制Qt的行为。如果你不想向Qt传递命令行参数,你可以跳过传递sys.argv ,而不传递任何东西*(PySide6*)或[] (其他PyQtPySide版本)。

在禁用这一行为之前,请务必仔细检查你是否需要Qt的任何命令行配置--例如,你正在为Raspberry Pi开发--。