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

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

Screenshot

注意:如果您想在Linux机器上构建此示例,请阅读此内容

简介

应用程序管理器作为自包含的执行文件编译,大部分可以通过基于YAML的配置文件系统和启动插件进行配置。但是,如果您需要更多控制应用程序的启动行为,可能需要实现自定义应用程序管理器执行文件。

注意:目前,应用程序管理器模块中的所有C++类都视为私有API,因此完全没有兼容性保证。

如果您仍然需要这种行为,此示例提供了一个起点,您可以在其基础上构建您的自定义实现。请注意,此自定义应用程序管理器执行文件需要一个系统UI来在屏幕上显示内容,就像标准的appman执行文件一样。

默认情况下,禁止链接到这些应用程序管理器模块,以防止来自QML插件的重复符号问题。但是在这里,构建针对它们是有意为之且必需的,因此我们需要设置定义AM_COMPILING_APPMAN

target_compile_definitions(custom-appman PRIVATE AM_COMPILING_APPMAN)

以下是需要的最小代码

#include <QtAppManMain/main.h>
#include <QtAppManMain/configuration.h>

using namespace Qt::StringLiterals;

QT_USE_NAMESPACE_AM

应用程序管理器分为功能构建块。这包括语句拉入您需要的基类集合。为了避免与QML插件可能出现的冲突,应用程序管理器的所有符号都是名称空间化的 - QT_USE_NAMESPACE_AM展开为等效的using语句。

    QCoreApplication::setApplicationName(u"Custom Application Manager"_s);
    QCoreApplication::setApplicationVersion(u"0.1"_s);

通常,设置应用程序名称和版本是一个好主意。

    std::unique_ptr<Main> a;
    std::unique_ptr<Configuration> cfg;

    try {
        a = std::make_unique<Main>(argc, argv, Main::InitFlag::ForkSudoServer

try块是自定义应用程序管理器的核心。您需要创建一个Main对象,它是从QGuiApplication(或在启用小部件支持的情况下为QApplication)派生的类。在这种情况下,我们将两个初始化标志提供给Main构造函数

第一个初始化标志ForkSudoServer对于应用程序管理器的安装部分很有用:如果可执行文件设置为setuid-root,这将隐式地派生一个子进程,在主进程中永久放弃root权限的同时保留root权限。

第二个初始化标志InitializeLogging为我们隐式设置应用程序管理器的日志部分(这在处理DLT日志时特别有用)。

这些部分也可以明确初始化,但你通常不需要这样做。

                                                   | Main::InitFlag::InitializeLogging);
        cfg = std::make_unique<Configuration>();
        cfg->parseWithArguments(QCoreApplication::arguments());

        a->setup(cfg.get());
        a->loadQml();
        a->showWindow(cfg->fullscreen() && !cfg->noFullscreen());

    } catch (const std::exception &e) {
        qCritical() << "ERROR:" << e.what();
        return 2;
    }

应用程序管理器需要一个合适的配置对象。在这种情况下,我们使用应用程序管理器的默认YAML解析,因此我们实例化一个Configuration对象。其余的功能包括解析配置,然后在对Main对象调用相关设置例程。

应用程序管理器中的大多数函数会抛出从 std::exception 派生的异常,因此必须具备一个 catch 异常处理器。

示例项目 @ code.qt.io

© 2024 Qt公司有限公司。本文件中的文档贡献属于其各自的著作权人。本文档是根据自由软件基金会发布的GNU自由文档许可证第1.3版条款许可的。Qt及其相关标志是芬兰以及全球其他国家的商标,商标归Qt公司所有。所有其他商标均属于各自的著作权人。