SIP:用Riverbank的SIP建立C++库的Python模块

咱们发现PyQt作的Python版的PyQt是如此好用,若是想把本身的C++库包装成Python模块该如何实现呢?html

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

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

例如:函数

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

参考QtCore/qcoreevent.sip指针

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

例如:htm

// 坑爹的模板函数,尤为是这种参数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中重写后会变成更诡异的同一个函数被不一样逻辑用不一样的参数调用…生命周期

相关文章
相关标签/搜索