C

创建布局的实际技巧

本主题提供了一些使用安全关键 UI 元素创建布局的实际技巧。例如,您如何使用 Qt 安全渲染器 QML 类型从 .qrc 文件中获取资源,以及如何利用 Qt 安全渲染器类从文件或资源结构中读取布局数据。

使用 .qrc 文件

当您使用 Qt Quick Designer 中的 Qt 安全渲染器 QML 类型创建布局时,您可以利用已添加到 Qt 的资源集合文件 (.qrc) 中的资源。例如,这些资源可以是用于 SafeImage QML 类型的图像文件。

在 Qt Creator 中,您可以按照以下方式在项目下创建一个新的 .qrc 文件

  1. 在 Qt Creator 中,选择 文件 > 新建文件或项目
  2. 文件和类 中,选择 Qt > Qt 资源文件
  3. 选择 choose
  4. 按照向导中的指示操作。

您可以按照以下方式将新资源添加到 .qrc 文件中

  1. 在 Qt Creator 中,打开 编辑 模式。
  2. 项目 中,右键单击 .qrc 文件。
  3. 选择 在编辑器中打开
  4. 选择 添加前缀 并定义一个前缀。
  5. 选择 添加文件
  6. 浏览到资源文件(例如,一个 .jpg 文件 并选择 打开

注意:在项目文件中,您必须记得为启用编译资源和生成 MISRA C++ 2008 兼容数据结构的资源编译器工具。有关更多信息,请参阅 启用 Qt 安全资源编译器工具

使用 QSafeLayoutResourceReader 读取布局数据

Qt 安全布局工具基于您使用 Qt Quick Designer (.ui.qml) 创建的布局生成原始布局文件 (.srl)。您可以将生成的原始布局文件添加到 Qt 的资源集合文件 (.qrc) 中,并使用 QSafeLayoutResourceReader 从那里读取布局数据。

static QSafeLayoutResourceReader layout = QSafeLayoutResourceReader("layoutData/SafeUI/SafeUI.ui.srl");

以下示例代码创建了一个新窗口,并使用 QSafeLayoutResourceReader 读取布局数据

static QSafeLayoutResourceReader layout = QSafeLayoutResourceReader("layoutData/SafeUI/SafeUI.ui.srl");

SafeWindow telltaleWindow(layout.size());
SafeRenderer::StateManager stateManager(telltaleWindow, layout);

for (quint32 i=0U;i<layout.count(); i++) {
    QSafeEventVisibility visible;
    visible.setId(layout.item(i).id());
    visible.setValue(1U);
    stateManager.handleEvent(visible);
}

EventHandler msgHandler(&stateManager);
msgHandler.handleEvents();

使用 QSafeLayoutFileReader 读取布局数据

如果您有一个已从 Qt Quick UI 窗体 (.ui.qml) 生成的原始布局文件 .srl》,您可以使用以下方式使用 QSafeLayoutFileReader 类读取其原始布局数据

static QSafeLayoutFileReader layout = QSafeLayoutFileReader("SafeUI.ui.srl");

使用 QSafeLayoutFileReader,Qt 的资源系统根本不直接使用。相反,使用文件系统来读取数据。

以下示例代码创建了一个新窗口,并使用 QSafeLayoutFileReader 读取布局数据

static QSafeLayoutFileReader layout = QSafeLayoutFileReader("SafeUI.ui.srl");

SafeWindow telltaleWindow(layout.size());
SafeRenderer::StateManager stateManager(telltaleWindow, layout);

for (quint32 i=0U;i<layout.count(); i++) {
    QSafeEventVisibility visible;
    visible.setId(layout.item(i).id());
    visible.setValue(1U);
    stateManager.handleEvent(visible);
}

EventHandler msgHandler(&stateManager);
msgHandler.handleEvents();

使用状态代替布局

从 Qt 安全渲染器 1.2 以后,qml 状态是用于需要更改安全关键 UI 元素的大小、颜色、不透明度或位置的用例的首选解决方案。之前,您会创建单独的布局并通过《a href="saferenderer-qsafeeventchangelayout.html">QSafeEventChangeLayout 事件来更改它们。

如果您使用布局来更改例如UI元素的位置,则更改布局事件仅会发送给当前激活的布局。由于每个布局都有自己的内存,如果您不同步布局,UI内容可能会不正确。

在特定的Qt许可证下可用。
了解更多信息。