zoukankan      html  css  js  c++  java
  • SIP:用Riverbank的SIP创建C++库的Python模块

    我们发现PyQt做的Python版的PyQt是如此好用,如果想把自己的C++库包装成Python模块该如何实现呢?

    这里介绍下用SIP包装C++库时值得参考的功能实现:

    • 需要Python模块中实现C++的多态指针类型自动转型为实际类型:

    例如:

    AbstractItem *getItem(); // 这里返回值可能是任何一个子类对象指针,但是在SIP包装后,始终返回AbstractItem对象,并不会根据实际类型自动转型。

    参考QtCore/qcoreevent.sip

    • 为模板类/模板函数生成Python对象/方法:

    例如:

    // 坑爹的模板函数,尤其是这种参数QtAbstractEditorFactory<PropertyManager>对于Python简直是噩梦
    template <class PropertyManager>
    void setFactoryForManager(PropertyManager *manager, QtAbstractEditorFactory<PropertyManager> *factory) {
            QtAbstractPropertyManager *abstractManager = manager;
            QtAbstractEditorFactoryBase *abstractFactory = factory;
    
            if (addFactory(abstractManager, abstractFactory))
                factory->addPropertyManager(manager);
    }

    参考phonon/objectdescription.sip

    • RuntimeError: wrapped C/C++ object of type xxx has been deleted

    遇到这种问题一般是不小心把C++对象的所有权交给了Python,在SIP中有/TransferBack/和/Factory/两种Annotation。可能是本来该由C++负责生命周期的C++对象,误标了这两个标记,去掉多半解决问题。

    • C++中尽量避免把重载接口包装为Python

    用过Python的都懂得,Python里面没有重载,因为Python是动态数据类型,并且支持可变参数。这样把C++的重载接口包装成Python会出现在Python中一个函数用不同的参数调用,行为不同。并且C++的这个重载接口如果是虚函数,在Python中重写后会变成更诡异的同一个函数被不同逻辑用不同的参数调用…

  • 相关阅读:
    TIB上海工作室成立!
    广州沙龙截止报名
    【广州】QTP自动化测试实战训练
    TIB自动化测试快讯 自动化测试空间一周精选(20111120)
    单一世界十万在线webgame的设计思路(一) 服务器数量预估
    JQuery 和 json.js 冲突问题
    公布一个小webgame代码
    dimensions.js 和 jquery UI 有冲突
    webgame创意之《吞噬者》
    c# 停止和开启 IIS 7.0 站点的方法
  • 原文地址:https://www.cnblogs.com/codingmylife/p/3534661.html
Copyright © 2011-2022 走看看