咱们发现PyQt作的Python版的PyQt是如此好用,若是想把本身的C++库包装成Python模块该如何实现呢?html
这里介绍下用SIP包装C++库时值得参考的功能实现:app
例如:函数
AbstractItem *getItem(); // 这里返回值多是任何一个子类对象指针,可是在SIP包装后,始终返回AbstractItem对象,并不会根据实际类型自动转型。
参考QtCore/qcoreevent.sip指针
例如: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对象
遇到这种问题通常是不当心把C++对象的全部权交给了Python,在SIP中有/TransferBack/和/Factory/两种Annotation。多是原本该由C++负责生命周期的C++对象,误标了这两个标记,去掉多半解决问题。接口
用过Python的都懂得,Python里面没有重载,由于Python是动态数据类型,而且支持可变参数。这样把C++的重载接口包装成Python会出如今Python中一个函数用不一样的参数调用,行为不一样。而且C++的这个重载接口若是是虚函数,在Python中重写后会变成更诡异的同一个函数被不一样逻辑用不一样的参数调用…生命周期