实现自定义应用管理器示例
提供自定义应用管理器可执行文件的基本结构和起点。
简介
应用管理器编译为一个自包含的可执行文件,可以通过基于 YAML 的配置文件系统和启动插件进行大部分配置。但是,如果您需要更多地控制应用启动行为,可能需要实现自定义应用管理器可执行文件。
注意:目前,应用管理器模块中所有 C++ 类被视为私有 API,因此没有任何兼容性保证。
如果您仍然需要这种行为,此示例提供了一个起点,您可以在其上构建自定义实现。请注意,这个自定义应用管理器可执行文件需要一个系统 UI 来在屏幕上显示内容,就像标准的 appman
可执行文件一样。
以下是需要的最少代码
#include <QtAppManCommon/global.h> #include <QtAppManCommon/logging.h> #include <QtAppManMain/main.h> #include <QtAppManMain/configuration.h> #include <QtAppManPackage/packageutilities.h> #include <QtAppManManager/sudo.h> QT_USE_NAMESPACE_AM
应用管理器被分为功能构建块。这包括引入您所需的基本类集合。为了避免与 QML 插件产生可能冲突,应用管理器中所有符号都是命名空间化的 - QT_USE_NAMESPACE_AM
转换为等效的 using
语句。
QCoreApplication::setApplicationName(qSL("Custom Application Manager")); QCoreApplication::setApplicationVersion(qSL("0.1"));
通常,设置应用名称和版本是个好主意。
Logging::initialize(argc, argv);
我们希望应用管理器的日志部分尽可能早地初始化,特别是当我们处理 DLT 日志时。
Sudo::forkServer(Sudo::DropPrivilegesPermanently);
同样,仅针对安装程序部分,在调用 QApplication 构造函数之前需要进一步的设置步骤:如果可执行文件被设置uid-root,此调用会创建一个子进程,保留根权限,而主进程永久丢弃它们。
try { Main a(argc, argv); Configuration cfg; cfg.parseWithArguments(QCoreApplication::arguments()); a.setup(&cfg); a.loadQml(cfg.loadDummyData()); a.showWindow(cfg.fullscreen() && !cfg.noFullscreen()); return MainBase::exec(); } catch (const std::exception &e) { qCCritical(LogSystem) << "ERROR:" << e.what(); return 2; }
这个 try
块是自定义应用管理器的核心。您需要创建一个 Main
对象,它是一个从 QGuiApplication 派生的类,以及一个合适的配置对象。在这个简单的例子中,我们使用应用管理器的默认 YAML 解析,因此我们实例化一个 DefaultConfiguration
对象。函数的其余部分涉及解析配置,然后在 Main
对象上调用相关的设置例程。
根据您应用管理器的配置,Main
对象可以以不同的方式派生:无头、带小部件或标准。因此,您需要知道 exec() 调用的正确基类。但是,使用 MainBase
指令可以绕过这个问题。
应用管理器中的大多数函数会抛出从 std::exception
派生的异常,因此需要一个 catch
处理器。
©2019 Luxoft Sweden AB。此处包含的文档贡献是各自所有者的版权。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可协议版本 1.3 许可。Qt 及相关标志是芬兰的 Qt 公司以及/或在其他国家/地区的商标。所有其他商标均为其各自所有者的财产。