QApplication 对象是每个Qt Widgets应用程序的核心。每个应用程序都需要一个而且只有一个QApplication 对象来运作。这个对象启动并保持你的应用程序的主事件循环,它管理着所有用户与GUI的交互。
当用PyQt或PySide开发应用程序时,你将创建一个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提供了一些内置的命令行参数,这些参数在PyQt和PySide 中也是可用的。
Qt特有的命令行参数
--platformplatformName[:options]指定Qt平台抽象(QPA)插件。这覆盖了QT_QPA_PLATFORM环境变量。
当在Raspberry Pi上开发应用程序时,这通常用于将Qt输出重定向到Linux帧缓冲设备(例如,一个自定义屏幕),而不使用XWindows。例如,-platform linuxfb:fb=/dev/fb1
-
--platformpluginpathpath指定平台插件的路径。这覆盖了QT_QPA_PLATFORM_PLUGIN_PATH环境变量。 -
--platformthemetheme指定平台的主题。这将覆盖QT_QPA_PLATFORMTHEME环境变量。 -
--pluginplugin指定要加载的额外插件。插件的值可以被多次传递。这将与QT_QPA_GENERIC_PLUGINS环境变量中的插件相连接。 -
--qmljsdebuggervalue激活 QML/JavaScript 调试器,指定的端口作为value 传递。该值必须是 ,其中port:1234[,block]block是可选的,它将使应用程序等待,直到有调试器连接到它。 -
--qwindowgeometrygeometry使用X11语法为主窗口指定一个几何图形,应该像--qwindowgeometry100x100+50+50那样传递。 -
--qwindowiconicon设置一个窗口的默认图标。 -
--qwindowtitletitle设置第一个窗口的标题。 -
--reverse设置应用程序的布局方向为Qt.RightToLeft。该选项旨在帮助调试,不应该在生产中使用。默认值是由系统的locale自动检测的。 -
--sessionsession从一个较早的会话恢复应用程序。
一般命令行参数
-
-h或 或 显示所有一般命令行参数的帮助,包括这个参数。注意, 参数只在 Windows 上可用。--help-?-? -
--help-all显示--help所做的工作以及所有Qt特定的命令行参数。 -
-v或 显示一个应用程序的版本。--version
我需要传递sys.argv 吗?
不需要。虽然传递sys.argv 允许你在应用程序启动时将命令行配置传递给Qt,但如果你不需要或想阻止从命令行配置Qt,你可以选择传递一个空列表[] (使用PyQt6、PyQt5、PySide2)或根本不传递(使用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.argv 到QApplication 允许你从命令行中定制Qt的行为。如果你不想向Qt传递命令行参数,你可以跳过传递sys.argv ,而不传递任何东西*(PySide6*)或[] (其他PyQt或PySide版本)。
在禁用这一行为之前,请务必仔细检查你是否需要Qt的任何命令行配置--例如,你正在为Raspberry Pi开发--。