QSB 手册

qsbQtShader Tools 模块提供的命令行工具。它集成了 glslangSPIRV-Cross 等第三方库,可选择调用 或 等外部工具,并生成 文件。此外,它还可用于检查 软件包的内容。fxc spirv-opt .qsb .qsb

Usage: qsb [options] file
Qt Shader Baker (using QShader from Qt 6.10.0)

Options:
  -?, -h, --help               Displays help on commandline options.
  --help-all                   Displays help, including generic Qt options.
  -v, --version                Displays version information.
  -b, --batchable              Also generates rewritten vertex shader for Qt
                               Quick scene graph batching.
  --zorder-loc <location>      The extra vertex input location when rewriting
                               for batching. Defaults to 7.
  --glsl <versions>            Comma separated list of GLSL versions to
                               generate. (for example, "100 es,120,330")
  --hlsl <versions>            Comma separated list of HLSL (Shader Model)
                               versions to generate. F.ex. 50 is 5.0, 51 is 5.1.
  --msl <versions>             Comma separated list of Metal Shading Language
                               versions to generate. F.ex. 12 is 1.2, 20 is 2.0.
  --qt6                        Equivalent to --glsl "100 es,120,150" --hlsl 50
                               --msl 12. This set is commonly used with shaders
                               for Qt Quick materials and effects.
  --msltess                    Indicates that a vertex shader is going to be
                               used in a pipeline with tessellation. Mandatory
                               for vertex shaders planned to be used with
                               tessellation when targeting Metal (--msl).
  --tess-vertex-count <count>  The output vertex count from the tessellation
                               control stage. Mandatory for tessellation
                               evaluation shaders planned to be used with Metal.
                               The default value is 3. If it does not match the
                               tess.control stage, the generated MSL code will
                               not function as expected.
  --tess-mode <mode>           The tessellation mode: triangles or quads.
                               Mandatory for tessellation control shaders
                               planned to be used with Metal. The default value
                               is triangles. Isolines are not supported with
                               Metal. If it does not match the tess.evaluation
                               stage, the generated MSL code will not function
                               as expected.
  --view-count <num_views>     The number of views the shader is used with.
                               num_views must be >= 2. Mandatory when multiview
                               rendering is used (gl_ViewIndex). Set only for
                               vertex shaders that really do rely on multiview
                               (as the resulting asset is tied to num_views).
                               Can be set for fragment shaders too, to get
                               QSHADER_VIEW_COUNT auto-defined. (useful for
                               ensuring uniform buffer layouts)
  -g                           Generate full debug info for SPIR-V and DXBC
  -O                           Invoke spirv-opt (external tool) to optimize
                               SPIR-V for performance.
  -o, --output <filename>      Output file for the shader pack.
  --qsbversion <version>       QSB version to use for the output file. By
                               default the latest version is automatically used,
                               use only to bake compatibility versions. F.ex. 64
                               is Qt 6.4.
  -c, --fxc                    In combination with --hlsl invokes fxc (SM
                               5.0/5.1) or dxc (SM 6.0+) to store DXBC or DXIL
                               instead of HLSL.
  -t, --metallib               In combination with --msl builds a Metal library
                               with xcrun metal(lib) and stores that instead of
                               the source. Suitable only when targeting macOS,
                               not iOS.
  -T, --metallib-ios           In combination with --msl builds a Metal library
                               with xcrun metal(lib) and stores that instead of
                               the source. Suitable only when targeting iOS, not
                               macOS.
  -D, --define <name[=value]>  Define macro. This argument can be specified
                               multiple times.
  -p, --per-target             Enable per-target compilation. (instead of
                               source->SPIRV->targets, do source->SPIRV->target
                               separately for each target)
  -d, --dump                   Switches to dump mode. Input file is expected to
                               be a shader pack.
  -x, --extract <what>         Switches to extract mode. Input file is expected
                               to be a shader pack. Result is written to the
                               output specified by -o. Pass -b to choose the
                               batchable variant.
                               <what>=reflect|spirv,<version>|glsl,<version>|...
  -r, --replace <what>         Switches to replace mode. Replaces the specified
                               shader in the shader pack with the contents of a
                               file. This argument can be specified multiple
                               times. Pass -b to choose the batchable variant.
                               Also supports adding a shader for a
                               target/variant that was not present before.
                               <what>=<target>,<filename> where
                               <target>=spirv,<version>|glsl,<version>|...
  -e, --erase <what>           Switches to erase mode. Removes the specified
                               shader from the shader pack. Pass -b to choose
                               the batchable variant.
                               <what>=spirv,<version>|glsl,<version>|...
  -s, --silent                 Enables silent mode. Only fatal errors will be
                               printed.
  --mediump                    Default to medium precision for floats in
                               fragment shaders instead of high. GLSL ES only;
                               ignored for everything else, including GLSL.
  --depfile <depfile>          Enables generating the depfile for the input
                               shaders, using the #include statements.

Arguments:
  file                         Vulkan GLSL source file to compile. The file
                               extension determines the shader stage, and can be
                               one of .vert, .tesc, .tese, .geom, .frag, .comp.
                               Note: Tessellation control/evaluation is not
                               supported with HLSL, instead use -r to inject
                               handcrafted hull/domain shaders. Some targets may
                               need special arguments to be set, e.g. MSL
                               tessellation will likely need --msltess,
                               --tess-vertex-count, --tess-mode, depending on
                               the stage. Geometry shaders are not supported
                               with HLSL and MSL.

运行模式

有五种主要运行模式:

  • .qsb 文件生成。
  • .qsb 文件检查。例如, 将打印反射元数据(JSON 格式)和包含的着色器。qsb -d myshader.frag.qsb
  • 提取模式。这允许将现有.qsb 文件中的指定着色器写入一个单独的文件。例如,qsb -x spirv,100 -o myshader.spv myshader.frag.qsb 会将 SPIR-V 二进制文件写入myshader.spv
  • 替换模式。这种模式允许用从指定文件读取的内容替换.qsb 文件中一个或多个着色器的内容。这样就可以将手工制作的着色器代码注入.qsb 软件包。
  • 删除模式。这将从.qsb 文件中删除指定的着色器变量。

示例

以下面的片段着色器为例:

#version 440

layout(location = 0) in vec2 v_texcoord;
layout(location = 0) out vec4 fragColor;
layout(binding = 1) uniform sampler2D tex;

layout(std140, binding = 0) uniform buf {
    float uAlpha;
};

void main()
{
    vec4 c = texture(tex, v_texcoord);
    fragColor = vec4(c.rgb, uAlpha);
}

执行qsb -o shader.frag.qsb shader.frag 会生成shader.frag.qsb 。使用qsb -d shader.frag.qsb 检查该文件后,我们发现

Stage: Fragment
QSB_VERSION: 5
Has 1 shaders:
  Shader 0: SPIR-V 100 [Standard]

Reflection info: {
    "combinedImageSamplers": [
        {
            "binding": 1,
            "name": "tex",
            "set": 0,
            "type": "sampler2D"
        }
    ],
    "inputs": [
        {
            "location": 0,
            "name": "v_texcoord",
            "type": "vec2"
        }
    ],
    "localSize": [
        0,
        0,
        0
    ],
    "outputs": [
        {
            "location": 0,
            "name": "fragColor",
            "type": "vec4"
        }
    ],
    "uniformBlocks": [
        {
            "binding": 0,
            "blockName": "buf",
            "members": [
                {
                    "name": "uAlpha",
                    "offset": 0,
                    "size": 4,
                    "type": "float"
                }
            ],
            "set": 0,
            "size": 4,
            "structName": "_27"
        }
    ]
}


Shader 0: SPIR-V 100 [Standard]
Entry point: main
Contents:
Binary of 864 bytes

默认情况下只生成 SPIR-V,因此使用此着色器包的应用程序只能在 Vulkan 下运行。让我们让它更有用吧:

qsb --glsl "100 es,120,150" --hlsl 50 --msl 12 -o shader.frag.qsb shader.frag

这就导致生成的着色器包也适用于 OpenGL、Direct 3D 和 Metal。该着色器使用的是基本功能,甚至 GLSL ES 100(OpenGL ES 2.0 的着色语言)也适用。

检查结果显示

Stage: Fragment
QSB_VERSION: 5
Has 6 shaders:
  Shader 0: GLSL 120 [Standard]
  Shader 1: HLSL 50 [Standard]
  Shader 2: GLSL 100 es [Standard]
  Shader 3: MSL 12 [Standard]
  Shader 4: SPIR-V 100 [Standard]
  Shader 5: GLSL 150 [Standard]

Reflection info: {
    ... <same as above>
}


Shader 0: GLSL 120 [Standard]
Entry point: main
Contents:
#version 120

struct buf
{
    float uAlpha;
};

uniform buf _27;

uniform sampler2D tex;

varying vec2 v_texcoord;

void main()
{
    vec4 c = texture2D(tex, v_texcoord);
    gl_FragData[0] = vec4(c.xyz, _27.uAlpha);
}

************************************

Shader 1: HLSL 50 [Standard]
Entry point: main
Native resource binding map:
0 -> [0, -1]
1 -> [0, 0]
Contents:
cbuffer buf : register(b0)
{
    float _27_uAlpha : packoffset(c0);
};

Texture2D<float4> tex : register(t0);
SamplerState _tex_sampler : register(s0);

static float2 v_texcoord;
static float4 fragColor;

struct SPIRV_Cross_Input
{
    float2 v_texcoord : TEXCOORD0;
};

struct SPIRV_Cross_Output
{
    float4 fragColor : SV_Target0;
};

void frag_main()
{
    float4 c = tex.Sample(_tex_sampler, v_texcoord);
    fragColor = float4(c.xyz, _27_uAlpha);
}

SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
    v_texcoord = stage_input.v_texcoord;
    frag_main();
    SPIRV_Cross_Output stage_output;
    stage_output.fragColor = fragColor;
    return stage_output;
}

************************************

...

Shader 3: MSL 12 [Standard]
Entry point: main0
Native resource binding map:
0 -> [0, -1]
1 -> [0, 0]
Contents:
#include <metal_stdlib>
#include <simd/simd.h>

using namespace metal;

struct buf
{
    float uAlpha;
};

struct main0_out
{
    float4 fragColor [[color(0)]];
};

struct main0_in
{
    float2 v_texcoord [[user(locn0)]];
};

fragment main0_out main0(main0_in in [[stage_in]], constant buf& _27 [[buffer(0)]], texture2d<float> tex [[texture(0)]], sampler texSmplr [[sampler(0)]])
{
    main0_out out = {};
    float4 c = tex.sample(texSmplr, in.v_texcoord);
    out.fragColor = float4(c.xyz, _27.uAlpha);
    return out;
}

************************************

...

Qt Quick 现在可以使用所有支持的图形应用程序接口:Vulkan、Direct 3D、Metal、OpenGL 和 OpenGL ES。运行时,位于Qt QuickQt Quick 3D 下方的 Qt XML 渲染硬件接口会自动选择相应的着色器。

除了将 SPIR-V 字节码翻译回更高级别的源代码外,该系统还负责处理其他问题,如确保 SPIR-V 绑定编号与本地资源的正确映射。例如,对于 HLSL,我们可以看到上面这样的部分:

Native resource binding map:
 0 -> [0, -1]
 1 -> [0, 0]

在内部,这允许将 SPIR-V 风格绑定点0 映射到 HLSL 寄存器b0 ,并将1 绑定到t0s0 。这有助于使各种着色语言之间的资源绑定差异对渲染硬件接口的用户透明化,并允许 Qt 中的所有内容按照原始 Vulkan 风格 GLSL 源代码中指定的 Vulkan/SPIR-V 风格绑定点进行操作。

着色器类型

着色器的类型是根据输入文件的扩展名推断出来的。因此,扩展名必须是以下其中之一:

  • .vert - 用于顶点着色器
  • .tesc - 用于细分控制着色器
  • .tese - 用于细分评估着色器
  • .frag - 用于片段(像素)着色器
  • .comp - 计算着色器

注: Direct 3D (HLSL) 目前不支持细分控制和评估着色器。

着色语言和版本

始终生成 SPIR-V 1.0。此外,生成的内容取决于命令行参数--glsl--hlsl--msl

这些参数后面都有一个以逗号分隔的列表。该列表必须包括 GLSL 风格的版本号,以及一个可选的后缀 (es, 表示 GLSL ES)。后缀和版本号之间的空格是可选的(没有空格可以避免使用引号)。

例如,Qt Quick 的内置材质(支持项目的着色器,如Image,Text,Rectangle )都使用--glsl "100 es,120,150" --hlsl 50 --msl 12 准备着色器。这使得它们与 OpenGL ES 2.0 及更高版本、OpenGL 2.1 及更高版本和 3.2 及更高版本的 OpenGL 核心配置文件上下文兼容。

如果着色器使用的函数或结构在指定的目标中没有对应,qsb 将失效。如果是这种情况,则需要调整目标,这也意味着应用程序的最低系统要求会被隐式调整。以textureLod GLSL 函数为例,该函数仅适用于 OpenGL ES 3.0 及以上版本(即 GLSL ES 300 或更高版本)。当请求 GLSL300 es 而不是100 es 时,qsb 会成功,但使用.qsb 文件的应用程序现在需要 OpenGL ES 3.0 或更高版本,与基于 OpenGL ES 2.0 的系统不兼容。

另一个明显的例子是计算着色器:.comp 着色器需要指定--glsl 310es,430 ,因为计算着色器仅适用于 OpenGL ES 3.1 或更新版本和 OpenGL 4.3 或更新版本。

为 HLSL 调整着色器模型版本或金属着色语言版本预计很少需要。着色器模型 5.0 (--hlsl 50) 和 MSL 1.2 (--msl 12) 通常就足够了。

Qt Quick 场景图批处理

Qt Quick 场景图的渲染器支持批处理几何图形,以减少绘制调用的次数。详情请参见场景图页面。这依赖于向顶点着色器的 main() 函数注入代码。在 Qt 5.x 中,这是通过修改所提供的 GLSL 顶点着色器代码在运行时实现的。在 Qt 6 中,这不是一个选项。相反,顶点着色器的可批处理变体可由qsb 工具构建。-b 。当输入不是带有.vert 扩展名的顶点着色器时,它不会产生任何影响。不过,对于顶点着色器,它会为每个目标生成两个版本。然后,Qt Quick 会在运行时自动选择正确的变体(标准或可批处理)。

注: 应用程序不必关心批处理的细节。它们只需确保在处理顶点着色器时指定-b (或等效的BATCHABLE 关键字,如果使用CMake 集成)。这只适用于与ShaderEffectQSGMaterialShader 一起使用的Qt Quick 着色器。

以下面的顶点着色器为例:

#version 440
layout(location = 0) in vec4 position;
layout(location = 1) in vec2 texcoord;
layout(location = 0) out vec2 v_texcoord;
layout(std140, binding = 0) uniform buf {
    mat4 mvp;
} ubuf;

void main()
{
    v_texcoord = texcoord;
    gl_Position = ubuf.mvp * position;
}

运行qsb -b --glsl 330 -o example.vert.qsb example.vert ,结果如下

Stage: Vertex
QSB_VERSION: 5
Has 4 shaders:
  Shader 0: GLSL 330 [Standard]
  Shader 1: GLSL 330 [Batchable]
  Shader 2: SPIR-V 100 [Standard]
  Shader 3: SPIR-V 100 [Batchable]

Reflection info: {
  ...

请注意所有目标语言和版本现在都有两种变体:标准版和稍作修改的批处理版。

调用外部工具

qsb 可以调用某些外部工具。这些工具分为两类:对 Shader 字节码进行优化的工具(SPIR-V),以及执行 Shader 编译第一阶段(从源代码到某种中间字节码格式)的特定平台工具。

这些功能可通过以下命令行选项启用:

  • -O - 调用 作为 SPIR-V 二进制文件的后处理步骤。 文件将包含优化版本。这假定 在系统上可用(例如,从 Vulkan SDK 获取),并可随时调用。spirv-opt .qsb spirv-opt
  • -c 或 - 调用 Direct 3D 着色器编译器 。生成的 (DirectX 字节代码)数据将存储在 文件中,而不是 HLSL。Qt XML 会在运行时自动获取这些数据,因此 文件的创建者可以自行决定包含 HLSL 源代码还是中间格式。在可能的情况下,我们更倾向于使用后者,因为它消除了在运行时解析 HLSL 源文件的需要,从而在创建图形流水线时大幅提高性能。缺点是只有在 Windows 上运行 时才能使用该参数。--fxc fxc.exe DXBC .qsb .qsb qsb
  • -t 或 - 调用相应的 XCode Metal 工具生成 .metallib 文件,并将其包含在 包中,而不是 MSL 源代码中。该选项只有在 在 macOS 上运行时可用。--metallib .qsb qsb

其他选项

  • -D - 定义一个宏。这样就可以在 GLSL 源代码中使用 #ifdef 和类似宏。
  • -g - 可以为 SPIR-V 生成完整的调试信息,从而使RenderDoc等工具在检查流水线或执行顶点或片段调试时显示完整的源代码。当指定 时,对 Direct 3D 也有影响,因为 会被指示在生成的中间字节码中包含调试信息。-c fxc
  • --mediump - 请求将 GLSL ES 片段着色器中的浮点数默认为中等精度。对于任何其他目标,包括(非 ES)GLSL 和非片段着色器,则忽略不计。

细分

  • --msltess - 表示顶点着色器用于包含细分阶段的流水线中。对其他类型的着色器以及未启用 MSL 着色器生成时无效。如果未指定,顶点着色器将无法在 Metal 上与细分阶段结合使用。
  • --tess-vertex-count <count> - 指定来自细分控制阶段的输出顶点计数。对于与 Metal 一起使用的细分评估着色器,必须指定此值。默认值为 3,如果与细分控制阶段不匹配,生成的 MSL 代码将无法按预期运行。
  • --tess-mode <mode> - 该选项指定细分模式。默认值为 。对于与 Metal 一起使用的细分控制着色器,必须指定该选项。该值必须与细分评估阶段相匹配,否则生成的 MSL 代码将无法按预期运行。triangles quads triangles

多视图

以下面的顶点着色器为例。它是以兼容 Vulkan 的 GLSL 编写的,可通过GL_EXT_multiview 扩展合法使用gl_ViewIndex

#version 440
#extension GL_EXT_multiview : require

layout(location = 0) in vec4 pos;
layout(std140, binding = 0) uniform buf
{
    mat4 mvp[2];
};

void main()
{
    gl_Position = mvp[gl_ViewIndex] * pos;
}

注意: 实际上,在传递给qsb 的源代码中不需要 #extension GL_EXT_multiview 行,因为在编译为 SPIR-V 之前,传递下文所述的--view-count 参数会自动将该行注入着色器源代码。

对于 Vulkan,只要运行时支持 Vulkan 1.1,就可以按原样运行。详情请参阅VK_KHR_multiview

要根据上述内容为 Direct 3D 12 生成 HLSL 顶点着色器(详见视图实例化),着色器模型的最低版本为 6.1,这意味着在指定qsb 时会失败,例如--hlsl 50 。处理多视图顶点着色器时,请至少使用--hlsl 61 。Direct 3D 11 不支持多视图。

对于 OpenGL,需要额外的元数据:

  • --view-count - 在将上述着色器(编译为 SPIR-V 后)转换为兼容 OpenGL 的 GLSL 源代码时,仅将 映射到 是不够的,还需要在着色器中声明视图数。如果 参数传递的值为 2,就会在生成的 GLSL 源代码中注入 语句,从而使其成为有效的(OpenGL)GLSL 着色器。详情请参阅gl_ViewIndex gl_ViewID_OVR --view-count layout(num_views = 2) in; GL_OVR_multiview,并注意生成的 GLSL 着色器还要求在运行时支持GL_OVR_multiview2,因为生成的着色器源代码中的 指令也要求支持#extension GL_OVR_multiview2

当使用此类顶点着色器针对 OpenGL (ES) 时,生成的 GLSL 版本 (--glsl) 必须至少为330300 esqsbQShaderBaker 并不强制执行前者,但在实践中,如果 GLSL 版本为 150 或更小,OpenGL 实现就会拒绝此类着色器。因此,建议在调节启用 GL_EXT_multiview 的顶点着色器时通过--glsl 330,300es

指定--view-count 会自动生成并注入一个预处理器定义:#define QSHADER_VIEW_COUNT n ,其中n 是视图数。如果没有提供视图数,则根本不会设置该定义。这样就可以编写出如下代码,并允许在着色器的所有视图数特定变体中使用相同的源文件。

layout(std140, binding = 0) uniform buf {
#if QSHADER_VIEW_COUNT >= 2
    mat4 matrix[QSHADER_VIEW_COUNT];
#else
    mat4 matrix;
#endif
    float opacity;
};

此外,只要视图计数设置为 2 或更大,#extension GL_EXT_multiview : require 行就会自动在顶点着色器中生成。这减少了在顶点着色器中添加多视图支持所需的额外行数。

设置视图数也与其他类型的着色器相关。例如,当顶点着色器和片段着色器共享一个统一缓冲区,且两个着色器都必须确保相同的缓冲区布局时,在两个源文件中都写入#if QSHADER_VIEW_COUNT >= 2 可能会很有用。这可以通过在调用qsb 时为两个文件指定--view-count 来实现。

注意: 在非顶点阶段(例如在片段着色器中)直接依赖gl_ViewIndex 关键字目前无法移植,应避免使用。

使用 OpenGL 特有的 GLSL 功能

有时需要使用 OpenGL 和 GLSL 特有的着色语言构造,而这些构造不适用于其他着色语言、中间格式和图形 API。

最典型的例子就是 OpenGL ES 的外部纹理和采样器。在实现视频播放或显示相机取景器时,根据平台的不同,可能需要使用 OpenGL 纹理对象,而这些对象并不能作为普通的 2D 纹理使用,而是可以通过 OpenGL API 中的GL_TEXTURE_EXTERNAL_OES绑定点和着色器中的samplerExternalOES 采样器类型,以有限的功能集使用。后者在使用基于 SPIR-V 的 Qt XML 着色器流水线时可能会造成问题:通过 qsb 运行此类着色器将导致失败,原因是samplerExternalOES 无法映射到 SPIR-V 和其他目标着色语言,因此不能被接受为有效类型。

为了解决这个问题,qsb 提供了一个选项,可以用从文件中读取的用户提供的数据替换 .qsb 文件中任何给定着色器变体的内容,从而完全替换 qsb 生成的原始着色器源代码或字节代码。

以下面的片段着色器为例。请注意tex 的类型。在使用 OpenGL ES 运行时,如果需要将该类型改为samplerExternalOES ,该怎么办?

#version 440

layout(location = 0) in vec2 texCoord;
layout(location = 0) out vec4 fragColor;

layout(std140, binding = 0) uniform buf {
    float opacity;
} ubuf;

layout(binding = 1) uniform sampler2D tex;

void main()
{
    fragColor = texture(tex, texCoord).rgba * ubuf.opacity;
}

仅仅更改 samplerExternalOES 的类型是不可行的。这会立即导致编译错误。

不过有一个简单的解决方案:编写一个单独的纯 OpenGL ES 目标版本的着色器,并将其注入 .qsb 文件。下面的着色器只与 GLSL ES 兼容,无法通过 qsb 运行。不过,我们知道它可以在运行时由 OpenGL ES 处理。

precision highp float;
#extension GL_OES_EGL_image_external : require
varying vec2 texCoord;

struct buf
{
    float opacity;
};

uniform buf ubuf;
uniform samplerExternalOES tex;

void main()
{
    gl_FragColor = texture2D(tex, texCoord).rgba * ubuf.opacity;
}

我们将其称为shader_gles.frag 。一旦qsb --glsl 100es -o shader.frag.qsb shader.frag 完成,为我们提供了一个(半成品).qsb 文件,我们就可以通过qsb -r glsl,100es,shader_gles.frag shader.frag.qsb 更新shader.frag.qsb ,用指定文件的内容取代 GLSL 100 es 的着色器 (shader_gles.frag)。现在,shader.frag.qsb 就可以在运行时与 OpenGL ES 配合使用了。

注: 注意保持着色器与应用程序之间的接口不变。一定要先检查 qsb 生成的 GLSL 代码,可以通过-d 选项打印 .qsb 文件内容,或通过运行qsb -x glsl,100es -o gles_shader.frag shader.frag.qsb 提取 GLSL ES 100 着色器。在手动注入的版本中,结构体、结构体成员和统一名称也不得不同。

注: 将任意文件中的数据放入 .qsb 包的功能也可用于注入手工制作的 "船体 "和 "域 "HLSL 着色器,以便使基于细分的图形流水线也能与 Direct 3D 配合使用。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.