实现自定义应用管理器示例

提供自定义应用管理器可执行文件的基本结构和起点。

Screenshot

简介

应用管理器编译为一个自包含的可执行文件,可以通过基于 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 处理器。

示例项目 @ code.qt.io

©2019 Luxoft Sweden AB。此处包含的文档贡献是各自所有者的版权。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可协议版本 1.3 许可。Qt 及相关标志是芬兰的 Qt 公司以及/或在其他国家/地区的商标。所有其他商标均为其各自所有者的财产。