使用代码模板

模板

template 节点注册了一个模板,可以在扩展生成的代码时避免重复代码,它是 typesystem 节点的子节点。

<typesystem>
    <template name="my_template">
        // the code
    </template>
</typesystem>

使用insert-template节点将模板代码(由模板的name属性标识)插入到生成的代码库中。

插入模板

insert-template 节点包含由 name 属性标识的代码模板,它可以是 inject-codeconversion-ruletemplate 节点的子节点。

<inject-code class="target" position="beginning">
    <insert-template name="my_template" />
</inject-code>

使用replace节点来修改模板代码。

替换

replace 节点允许您在将模板代码插入生成的代码之前对其进行修改,并且它可以是 insert-template 节点的子节点。

<insert-template name="my_template">
   <replace from="..." to="..." />
</insert-template>

此节点将用to指向的值替换属性from

预定义模板

shiboken 中内置了许多用于 STL 和 Qt 类型转换规则的 XML 模板。

primitive-type的模板:

名称

描述

shiboken_conversion_pylong_to_cpp

将 PyLong 转换为 C++ 类型

container-type的模板:

一些容器类型是内置的。如果需要明确指定,可以使用以下模板:

shiboken_conversion_pysequence_to_cpppair

将 PySequence 转换为 C++ 对(std::pair/QPair)

shiboken_conversion_cpppair_to_pytuple

将C++对(std::pair/QPair)转换为PyTuple

shiboken_conversion_cppsequence_to_pylist

将C++顺序容器转换为PyList

shiboken_conversion_cppsequence_to_pyset

将C++顺序容器转换为PySet

shiboken_conversion_pyiterable_to_cppsequentialcontainer

将可迭代的Python类型转换为C++顺序容器(STL/Qt)

shiboken_conversion_pyiterable_to_cppsequentialcontainer_reserve

将可迭代的Python类型转换为支持reserve()的C++顺序容器

shiboken_conversion_pyiterable_to_cpparray

将可迭代的Python类型转换为固定大小的数组(std::array, std::span)

shiboken_conversion_pyiterable_to_cppsetcontainer

将 PySequence 转换为集合类型的 C++ 容器(std::set/QSet)

shiboken_conversion_stdmap_to_pydict

将 std::map/std::unordered_map 转换为 PyDict

shiboken_conversion_qmap_to_pydict

将 QMap/QHash 转换为 PyDict

shiboken_conversion_pydict_to_stdmap

将 PyDict 转换为 std::map/std::unordered_map

shiboken_conversion_pydict_to_qmap

将 PyDict 转换为 QMap/QHash

shiboken_conversion_stdmultimap_to_pydict

将 std::multimap 转换为值列表的 PyDict

shiboken_conversion_qmultimap_to_pydict

将QMultiMap转换为值列表的PyDict

shiboken_conversion_stdunorderedmultimap_to_pydict

将 std::unordered_multimap 转换为值列表的 PyDict

shiboken_conversion_qmultihash_to_pydict

将QMultiHash转换为值列表的PyDict

shiboken_conversion_pydict_to_stdmultimap

将值列表的PyDict转换为std::multimap/std::unordered_multimap

shiboken_conversion_pydict_to_qmultihash

将值列表的PyDict转换为QMultiMap/QMultiHash

使用这些模板的 std::list 类型的条目如下所示:

<container-type name="std::list" type="list">
    <include file-name="list" location="global"/>
    <conversion-rule>
        <native-to-target>
            <insert-template name="shiboken_conversion_cppsequence_to_pylist"/>
        </native-to-target>
        <target-to-native>
            <add-conversion type="PySequence">
                <insert-template name="shiboken_conversion_pyiterable_to_cppsequentialcontainer"/>
            </add-conversion>
        </target-to-native>
    </conversion-rule>
</container-type>