咱們發現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中重寫後會變成更詭異的同一個函數被不一樣邏輯用不一樣的參數調用…生命週期