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

相關文章
相關標籤/搜索