实现自定义应用程序管理器示例
提供自定义应用程序管理器可执行文件的基本结构和起点。
注意:如果您想在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
异常处理器。
© 2024 Qt公司有限公司。本文件中的文档贡献属于其各自的著作权人。本文档是根据自由软件基金会发布的GNU自由文档许可证第1.3版条款许可的。Qt及其相关标志是芬兰以及全球其他国家的商标,商标归Qt公司所有。所有其他商标均属于各自的著作权人。