指定类型

包含代码片段

可能会有重复的XML代码,例如需要在没有类型继承关系的类上进行的函数修改。可以将这些代码片段拆分出来,并通过实体引用包含它们。

<typesystem>
    <object-type name="A">
        &common_function_modifications;
    </object-type>
    <object-type name="B">
        &common_function_modifications;
    </object-type>
</typesystem>

实体名称被解释为文件名(带有后缀xml),并在作为命令行参数传递的类型系统路径中解析。

请注意,由于底层解析器的限制,这不是一个标准的可外部解析的实体。

类型系统

这是包含所有类型系统信息的根节点。 它可能包含add-functioncontainer-typecustom-typeenum-typeextra-includesfunctionload-typesystemnamespace-typeobject-typeopaque-containerprimitive-typerejectionsmart-pointer-typesuppress-warningtemplatesystem-includetypedef-typevalue-type子节点。

它可以有许多属性,如下所述。

<typesystem package="..."
            submodule-of="..."
            allow-thread="..."
            exception-handling="..."
            snake-case="yes | no | both"
            namespace-begin="..."
            namespace-end="..."
            doc-package="..."
            doc-mode = "nested | flat" >
</typesystem>

package 属性是一个描述要使用的包的字符串,例如“QtCore”。

可选的 submodule-of 属性指定了模块作为子模块添加到的模块名称。这需要相应地调整模块的安装目录。

可选的属性 allow-threadexception-handling 指定了相应函数修改的默认处理方式 (参见 modify-function)。

可选的 snake-case 属性指定函数和字段名称是否会自动更改为Python中常见的蛇形命名风格(例如,snakeCase 将被更改为 snake_case)。

both 表示函数或字段将同时以其原始名称和蛇形命名版本公开。不过,这有一些限制:

  • 在Python中重写C++类的虚函数时,必须使用蛇形命名法。

  • 当一个类的成员函数存在静态和非静态重载时(例如QFileInfo::exists()的情况),必须使用蛇形命名法。

可选的 namespace-beginnamespace-end 属性将在模块头文件中的前向声明周围生成。这适用于那些可以选择使用内联命名空间以允许将多个版本链接在一起的库。例如,对于 Qt,可以分别指定 QT_BEGIN_NAMESPACEQT_END_NAMESPACE

可选的属性 doc-package 指定了文档的替代包名。这用于查找文档生成的 qdocdoxygen 文件。它主要与 Qt 相关,例如 QtMultimediaWidgets 模块的文档被生成到 QtMultimedia 模块中。

可选属性 doc-mode 决定是否将内部类的文档嵌套到外部类的页面中。其默认值为 nested。如果命名空间中包含太多类,导致页面过长,可以通过指定 flat 来关闭此功能。然而,引用可能无法完全正常工作。

加载类型系统

load-typesystem 节点指定在将多个库映射到另一种语言或基于一个库构建另一个库时要加载的类型系统,它是 typesystem 节点的子节点。

<typesystem>
    <load-typesystem name="..." generate="yes | no" />
</typesystem>

name 属性是要加载的类型系统的文件名, generate 属性指定是否应生成代码。当基于另一个库时,必须指定后者,使生成器能够理解继承层次结构、原始映射、函数中的参数类型等。

大多数库将基于QtCore和QtGui模块,在这种情况下,这些库的代码生成将被禁用。

拒绝

rejection 节点拒绝给定的类,或指定的函数或字段,它是 typesystem 节点的子节点。

<typesystem>
    <rejection class="..."
        function-name="..."
        argument-type="..."
        field-name="..." />
</typesystem>

class 属性是要拒绝的类的 C++ 类名。使用可选的 function-nameargument-typefield-name 属性来拒绝特定的函数、具有特定类型参数的函数或字段。请注意,field-namefunction-name/argument-type 不能同时指定。要删除给定字段或函数的所有出现,请将 class 属性设置为 *。

原始类型

primitive-type 节点描述了如何将基本类型从 C++ 映射到目标语言,并且是 typesystem 节点的子节点。它可能包含 conversion-rule 子节点。请注意,大多数基本类型已经在 QtCore 类型系统中指定(参见 Primitive C++ Types)。

<typesystem>
    <primitive-type name="..."
        since="..."
        until="..."
        target-lang-api-name="..."
        default-constructor="..."
        preferred-conversion="yes | no"
        view-on="..." />
</typesystem>

name 属性是 C++ 中原始类型的名称。

可选的 target-lang-api-name 属性是目标语言中原始类型的名称,默认为 name 属性。

可选的 since 值用于指定引入该类型的 API 版本。

同样,可选的 until 值可用于指定API版本,该类型将在该版本中被废弃。

如果可选的 preferred-conversion属性设置为no,则表示此版本的原始类型不是目标语言类型的首选C++等效类型。例如,在Python中,“qint64”和“long long”都变为“long”,但我们应优先选择“qint64”版本。因此,我们将“long long”标记为preferred-conversion=”no”。

可选的 default-constructor 指定了构建原始类型值所需的最小构造函数调用。当原始类型可以使用默认构造函数(无参数的构造函数)构建时,不需要此选项。

可选的 preferred-conversion 属性告诉如何构建基本类型的默认实例。它应该是一个能够创建基本类型实例的构造函数调用。例如:一个类“Foo”可以有一个preferred-conversion值设置为“Foo()”。通常,此属性仅用于声明为基本类型的类,而不用于基本C++类型,但这取决于使用ApiExtractor的应用程序。

可选的 view-on 属性指定类型是一个视图类,如 std::string_view 或 QStringView,它们有一个接受其他类型(如 std::string 或 QString)的构造函数。由于通常不能为视图类赋值,因此不能为它们生成目标到本地的转换。相反,应该实例化被查看类的实例,并将其传递给使用视图类作为参数类型的函数。

查看预定义模板以获取标准类型转换规则的内置模板。

命名空间类型

namespace-type 节点将给定的 C++ 命名空间映射到目标语言,它是 typesystem 节点或其他 namespace-type 节点的子节点。它可能包含 add-functiondeclare-functionenum-typeextra-includesincludemodify-functionnamespace-typeobject-typesmart-pointer-typetypedef-typevalue-type 子节点。

<typesystem>
    <namespace-type name="..."
        visible="true | auto | false"
        generate="yes | no"
        generate-using="yes | no"
        package="..."
        since="..."
        extends = "..."
        files = "..."
        doc-file = "..."
        revision="..." />
</typesystem>

name 属性是命名空间的名称,例如,“Qt”。

可选的 visible 属性用于指定命名空间在目标语言名称中是否可见。其默认值为 auto。这意味着普通命名空间是可见的,但内联命名空间(如C++ 11中引入的)将不可见。

检测内联命名空间需要 shiboken 使用 LLVM 9.0 构建。

可选的 generate 是一个遗留属性。指定 no 等同于 visible=”false”

可选的 generate-using 属性指定是否在命名空间内的类的包装代码中生成 using namespace(默认值:yes)。这确保了例如默认参数值的未完全限定枚举值能够编译。 然而,在极少数情况下,它可能会导致歧义,此时可以将其关闭。

package 属性可用于覆盖类型系统的包。

可选的 since 值用于指定此类型的API版本。

revision 属性可用于为每种类型指定一个修订版本,从而简化生成 ABI 兼容绑定的过程。

可选的 extends 属性指定了在命名空间跨越多个模块的情况下,给定命名空间首次出现的模块名称。例如,在 Qt 中,命名空间 Qt 首次出现在 QtCore 模块中,并在 QtGui 模块中进一步填充。如果指定了 extends,则会生成扩展 QtCore.QtQtGui.Qt

可选的 file 属性指定了一个正则表达式,用于匹配包含文件的内容,这些内容将在命名空间跨越多个模块的情况下与当前模块关联。

可选的 doc-file 属性指定了包含类文档的 .qdoc 文件的基本名称(仅适用于 qdoc)。

枚举类型

enum-type 节点将给定的枚举从 C++ 映射到目标语言,它是 typesystem 节点的子节点。使用 reject-enum-value 子节点来拒绝某些值。

<typesystem>
    <enum-type name="..."
        identified-by-value="..."
        class="yes | no"
        since="..."
        flags="yes | no"
        flags-revision="..."
        cpp-type = "..."
        doc-file = "..."
        python-type = "IntEnum | IntFlag"
        lower-bound="..."
        upper-bound="..."
        force-integer="yes | no"
        extensible="yes | no"
        revision="..." />
</typesystem>

name 属性是枚举的完全限定 C++ 名称(例如,“Qt::FillRule”)。如果可选flags 属性设置为 yes(默认值为 no),生成器将期望为给定的枚举类型存在一个 QFlagslower-boundupper-bound 属性用于指定枚举值的运行时边界检查。该值必须是一个可编译的目标语言语句,例如“QGradient.Spread.PadSpread”(再次以 Python 为例)。如果 force-integer 属性设置为 yes(默认值为 no),生成的目标语言代码将使用目标语言的整数而不是枚举。最后,extensible 属性指定给定的枚举是否可以用用户值扩展(默认值为 no)。

可选的 since 值用于指定此类型的API版本。

属性 identified-by-value 帮助使用其值之一的名称来指定匿名枚举,该名称在匿名枚举范围内是唯一的。 请注意,enum-type 标签可以具有 nameidentified-by-value,但不能同时具有两者。

可选的 python-type 属性指定了底层的 Python 类型。

可选的 cpp-type 属性指定了用于转换值的C++类型。这对于触发MSVC符号问题的大值非常有用。

可选的 doc-file 属性指定了由 \relates\headerfileqdoc 中指示的 C++ 或 .qdoc 文件的基本名称,枚举的文档将被添加并显示在其中,如果它是一个全局枚举。此属性仅适用于 qdoc

revision 属性可用于为每种类型指定一个修订版本,从而简化生成 ABI 兼容绑定的过程。

flags-revision 属性的用途与 revision 属性相同,但用于与此枚举相关的 QFlag。

拒绝枚举值

reject-enum-value 节点拒绝由 name 属性指定的枚举值,并且它是 enum-type 节点的子节点。

<enum-type>
    <reject-enum-value name="..."/>
</enum-type>

当C++枚举实现具有多个相同的数值时,通常会使用此节点,其中一些数值通常是过时的。

值类型

value-type 节点表示给定的 C++ 类型被映射为目标语言中的值类型。这意味着它是一个在 C++ 中按值传递的对象,即它存储在函数调用堆栈中。它是 typesystem 节点或其他类型节点的子节点,并且可能包含 add-functionadd-pymethoddefconfigurationdeclare-functionconversion-ruleenum-typeextra-includesincludemodify-functionobject-typesmart-pointer-typetypedef-type 或进一步的 value-type 子节点。

<typesystem>
    <value-type name="..." since="..."
     copyable="yes | no"
     allow-thread="..."
     disable-wrapper="yes | no"
     exception-handling="..."
     generate-functions="..."
     isNull ="yes | no"
     operator-bool="yes | no"
     hash-function="..."
     private="yes | no"
     qt-register-metatype = "yes | no | base"
     stream="yes | no"
     default-constructor="..."
     revision="..."
     snake-case="yes | no | both"
     doc-file = "..." />
</typesystem>

name 属性是完全限定的 C++ 类名,例如“QMatrix”或“QPainterPath::Element”。copyable 属性用于强制或指定此类型是否可复制。可选的 hash-function 属性通知该类型的哈希函数的函数名称。

可选的属性stream指定了此类型是否能够使用外部定义的运算符,如QDataStream <<和>>。如果等于yes,这些运算符将在当前类中作为普通方法调用。

可选的 since 值用于指定此类型的API版本。

可选的 default-constructor 指定了构建值类型实例所需的最小构造函数调用。当值类型可以使用默认构造函数(无参数的构造函数)构建时,这是不需要的。通常,代码生成器可以根据值类型的构造函数签名猜测出一个最小构造函数,因此 default-constructor 仅在非常特殊的情况下使用。

对于可选的 disable-wrappergenerate-functions 属性,请参见 object-type

对于可选的 私有属性,请参见定义实体

可选的 qt-register-metatype 属性决定了是否为 name 生成 Qt 元类型注册。默认情况下,对于非抽象、可默认构造的类型,会生成此注册以用于信号和槽。值 base 表示将为所讨论的类生成注册,但不会为继承类生成注册。这允许将注册限制为类型层次结构的基类。

revision 属性可用于为每种类型指定一个修订版本,从而简化生成 ABI 兼容绑定的过程。

可选的属性 allow-threadexception-handling 指定了相应函数修改的默认处理方式 (参见 modify-function)。

可选的 snake-case 属性允许覆盖在 typesystem 元素上指定的值。

可选的 isNulloperator-bool 属性可用于覆盖生成布尔转换的命令行设置(参见 Bool Cast)。

可选的 doc-file 属性指定了包含类文档的 .qdoc 文件的基本名称(仅适用于 qdoc)。

对象类型

对象类型节点表示给定的C++类型被映射为目标语言中的对象类型。这意味着它在C++中是通过指针传递的对象,并且存储在堆上。它是typesystem节点或其他类型节点的子节点,可能包含add-functionadd-pymethoddefconfigurationdeclare-functionenum-typeextra-includesincludemodify-functionobject-typesmart-pointer-typetypedef-typevalue-type子节点。

<typesystem>
    <object-type name="..."
     since="..."
     copyable="yes | no"
     allow-thread="..."
     disable-wrapper="yes | no"
     exception-handling="..."
     generate-functions="..."
     force-abstract="yes | no"
     hash-function="..."
     isNull ="yes | no"
     operator-bool="yes | no"
     parent-management="yes | no"
     polymorphic-id-expression="..."
     polymorphic-name-function="..."
     polymorphic-base="yes | no"
     private="yes | no"
     qt-metaobject="yes | no"
     qt-register-metatype = "yes | no | base"
     stream="yes | no"
     revision="..."
     snake-case="yes | no | both"
     doc-file = "..." />
</typesystem>

name 属性是完全限定的 C++ 类名。如果没有 C++ 基类,可以使用 default-superclass 属性为生成的 target language API 中的给定类型指定一个超类。copyablehash-function 属性与 value-type 中描述的相同。

可选的 force-abstract 属性强制类为抽象类,禁止其实例化。生成器通常会自动检测这一点,除非类继承自类型系统中不存在的抽象基类。

可选的 disable-wrapper 属性禁用生成 C++ 包装器(参见 代码生成术语)。这将 有效地禁用 Python 中类的虚方法重写。 当类无法从 Python 实例化且 其虚方法对代码生成器造成某些问题时(例如返回 引用,或使用无法为参数生成的默认值, 或类似情况),可以使用此属性。

对于可选的 私有属性,请参见定义实体

可选的 qt-metaobject 属性指定是否生成特殊的 Qt 虚函数 metaObject()metaCall()metaCast()。例如,对于使用动态元对象的类,如 QDBusInterface,可以将其关闭。

可选的 qt-register-metatype 属性决定了是否为 name * 生成 Qt 元类型注册。默认情况下,仅为非 QObject 类型生成此注册,以便在信号和槽中使用。base 值意味着将为所讨论的类生成注册,但不会为继承类生成注册。这允许将注册限制为类型层次结构的基类。

可选的属性stream指定了此类型是否能够使用外部定义的运算符,如QDataStream <<和>>。如果等于yes,这些运算符将在当前类中作为普通方法调用。

可选的 since 值用于指定此类型的API版本。

revision 属性可用于为每种类型指定一个修订版本,从而简化生成 ABI 兼容绑定的过程。

可选的属性 allow-threadexception-handling 指定了相应函数修改的默认处理方式 (参见 modify-function)。

可选的 generate-functions 指定了一个分号分隔的函数名称或最小签名列表,用于生成绑定。这允许限制生成绑定的函数。这也适用于虚函数;因此,所有抽象函数都需要列出,以防止生成无法编译的代码。如果未指定任何内容,则会为所有合适的函数生成绑定。请注意,特殊函数(构造函数等)无法指定。

可选的 snake-case 属性允许覆盖在 typesystem 元素上指定的值。

可选的 isNulloperator-bool 属性可用于覆盖生成布尔转换的命令行设置(参见 Bool Cast)。

可选的 parent-management 属性指定该类用于构建由父对象和子对象组成的对象树,例如像 QWidget 类这样的用户界面。对于这些类,Parentship heuristicsReturn value heuristics 启用的启发式方法将自动设置父关系。兼容性说明:在 shiboken 6 中,当类型系统中没有类设置此属性时,启发式方法将应用于所有类。在 shiboken 7 中,设置此属性将是强制性的。

对于可选的 polymorphic-id-expressionpolymorphic-name-functionpolymorphic-base属性,请参阅类型发现属性参考

可选的 doc-file 属性指定了包含类文档的 .qdoc 文件的基本名称(仅适用于 qdoc)。

接口类型

此类型已弃用,不再具有任何效果。请改用 object-type。

container-type

container-type 节点表示给定的类是一个容器,必须使用由属性 type 提供的转换助手之一来处理。它是 typesystem 节点的子节点,并且可能包含 conversion-rule 子节点。

<typesystem>
    <container-type name="..."
        since="..."
        type ="..."
        opaque-containers ="..." />
</typesystem>

name 属性是完全限定的 C++ 类名。type 属性用于指示将应用于容器的转换规则。它可以是以下之一:listsetmapmulti-mappair

在6.2版本中,某些类型已被弃用:string-listlinked-listvectorstackqueue等同于listhashmulti-hash分别等同于mapmulti-map

可选的 opaque-containers 属性指定了一个分号分隔的映射列表,从实例化到Opaque Containers的类型名称:

<typesystem>
    <container-type name="std::array"
                    opaque-containers ="int,3:IntArray3;float,4:FloatArray4">

可选的 since 值用于指定此容器的API版本。

一些常见的标准容器是内置的,还有一些有用的预定义转换模板

opaque-container

opaque-container 元素可用于向现有容器类型(内置或由包含模块中的 container-type 指定)添加更多 opaque containers 的实例化。它是 typesystem 节点的子节点。

<typesystem>
    <oqaque-container name="..." opaque-containers ="..." />
</typesystem>

对于nameopaque-containers属性, 请参见container-type

typedef类型

typedef-type 节点允许在类型系统中指定类型定义。它们通常等同于在包含的头文件中拼写出类型定义,这在尝试封装源代码不易扩展的库时通常很复杂。它是typesystem节点或其他类型节点的子节点。

<typesystem>
    <typedef-type name="..."
        source="..."
        since="..." />
</typesystem>

source 属性是源。示例:

<namespace-type name='std'>
    <value-type name='optional' generate='no'/>\n"
</namespace-type>
<typedef-type name="IntOptional" source="std::optional&lt;int&gt;"/>

等同于

typedef std::optional<int> IntOptional;

可选的 since 值用于指定此类型的API版本。

自定义类型

custom-type 节点只是让解析器知道目标语言类型的存在,从而避免在尝试查找函数签名和其他地方使用的类型时出现错误。自定义类型的正确处理应由使用 APIExractor 的生成器完成。它是 typesystem 节点的子节点。

<typesystem>
    <custom-type name="..."
        check-function="..." />
</typesystem>

name 属性是自定义类型的名称,例如,“PyObject”。

可选的 check-function 属性可用于指定一个布尔检查函数,该函数验证 PyObject 是否属于函数重载决策器中的给定类型。虽然 shiboken 知道常见的检查函数,如 PyLong_Check()PyType_Check(),但对于修改为自定义类型的函数参数(由注入代码处理),提供一个检查函数可能很有用(参见 replace-type)。

查看CPython Types了解内置类型。

智能指针类型

smart pointer 类型节点表示给定的类是一个智能指针,并且需要插入对 getter 的调用来访问指针对象。目前,其使用仅限于函数返回值。ref-count-method 指定用于进行引用计数的方法的名称。它是 typesystem 节点或其他类型节点的子节点。

可选的属性instantiations指定将为智能指针包装器的哪些实例生成代码(逗号分隔的列表)。 默认情况下,这将为代码解析找到的所有实例生成。 在链接不同模块时,这可能会成为一个问题,因为相同实例的包装器可能会生成到不同的模块中,从而导致冲突。 提供实例列表可以指定哪些包装器将生成到特定模块中。

<typesystem>
    <smart-pointer-type name="..."
        since="..."
        type="shared | handle | value-handle | unique"
        getter="..."
        ref-count-method="..."
        value-check-method="..."
        null-check-method="..."
        reset-method="..."
        instantiations="..."/>
    </typesystem>

可选的属性 value-check-method 指定了一个方法,该方法可用于检查指针是否具有值。

可选的属性 null-check-method 指定了一个方法,可以用来检查 nullptr

可选的属性 reset-method 指定了一个方法,可以用来清除指针。

可选的实例化属性指定了一个逗号分隔的实例化类型列表。当留空时,代码中找到的所有实例化都将被生成。类型名称可以选择性地后跟等号和Python类型名称,例如instantiations="int=IntPtr,double=DoublePtr"。也可以指定由::分隔的命名空间。默认情况下,类型将位于智能指针的命名空间中,例如,std对于std::shared_ptr。在类型名称前加上::将使其位于全局命名空间中。

可选的属性 type 指定了类型:

shared

一个标准的共享指针。

handle

一个基本的指针句柄,它具有一个getter函数和一个operator->

value-handle

一个具有返回值的getter函数的句柄 (T 而不是 T * 作为其他类型)。 它可以用于 std::optional

unique

一个标准的、唯一的指针(std::unique_ptr)或类似的 可移动指针。 为此工作,必须指定reset-method属性。

下面的示例展示了一个 std::shared_ptr 的条目:

<system-include file-name="memory"/>

<namespace-type name="std">
    <include file-name="memory" location="global"/>
    <modify-function signature="^.*$" remove="all"/>
    <enum-type name="pointer_safety"/>
    <smart-pointer-type name="shared_ptr" type="shared" getter="get"
                        ref-count-method="use_count"
                        instantiations="Integer">
        <include file-name="memory" location="global"/>
    </smart-pointer-type>
</namespace-type>

如果智能指针是命名空间 std 中唯一相关的类,它也可以被隐藏:

<namespace-type name="std" visible="no">
    <smart-pointer-type name="shared_ptr" type="shared" getter="get"
                        ref-count-method="use_count"
                        instantiations="Integer">
        <include file-name="memory" location="global"/>
    </smart-pointer-type>
</namespace-type>

首先,shiboken被指示实际解析包含类定义的系统包含文件,使用system-include元素。对于namespace-typesmart-pointer-type,提供了标准包含文件以覆盖内部实现头文件shared_ptr.h。这将创建一些需要添加到模块的CMakeLists.txt中的包装源文件。

函数

function 节点表示给定的 C++ 全局函数被映射到目标语言。它是 typesystem 节点的子节点,并且可能包含一个 modify-function 子节点。

<typesystem>
    <function signature="..." rename="..." since="..."
              allow-thread="true | auto | false"
              doc-file = "..."
              exception-handling="off | auto-off | auto-on | on"
              overload-number="number"
              snake-case="yes | no | both" />
</typesystem>

有一个限制;你不能使用add-function标签向现有函数添加函数重载。

可选的 since 属性用于指定引入该函数的API版本。

可选的 rename 属性用于修改函数名称。

可选的 doc-file 属性指定了由 \relates\headerfileqdoc 中指示的 C++ 或 .qdoc 文件的基本名称,函数的文档将被添加并显示在其中,如果它是一个全局函数。此属性仅适用于 qdoc

对于可选属性allow-threadexception-handlingoverload-numbersnake-case,请参见modify-function

系统包含

可选的 system-include 指定要解析的系统包含文件的名称或系统包含路径(以斜杠结尾)。通常,C++ 代码解析器会跳过被视为系统包含文件的包含文件。其主要用例是暴露 STL 库中的类。它是 typesystem 节点的子节点。

<typesystem>
    <system-include file-name="memory"/>
    <system-include file-name="/usr/include/Qt/"/>
</typesystem>

条件处理

提供了简单的处理指令,用于根据关键字的存在与否来包含或排除部分内容。语法如下:

<?if keyword !excluded_keyword ?>
   ...
<?endif?>

有预定义的关键字表示操作系统(windowsunixdarwin)。

传递给language-level命令行选项的语言级别反映为c++11c++14c++17c++20

传递给 –drop-type-entries 命令行选项的类名 也是预定义的,前缀为 no_。这允许例如 将引用这些类的添加函数包含在 !no_ClassName?>, 中。

可以使用–keywords命令行选项指定其他关键字。

定义实体

可以使用简单的处理指令来定义实体:

<?entity name value?>
<text>&name;</text>

这允许根据平台定义函数签名,与条件处理结合使用。

私有类型

object-typevalue-type条目标记为私有会导致为它们生成一个单独的私有模块头,除了公共模块头之外。

这可以用于在依赖模块中未引用的类,并有助于防止例如它们所需的私有C++头文件的传播。