2011-11-29 119 views
0

我的應用程序在整個C++ API中使用QSharedPointers,而不是返回一個對象,它通常返回一個智能指針,並且每個類都有一個伴隨typedef以方便使用。智能指針與PythonQt

class SomeClass 
{ 
SomeClassP getInstance() { return SomeClassP(new SomeClass()); } 
} 
typedef QSharedPointer<SomeClass> SomeClassP; 

這很好,但我想知道如果我的設計需要改變以處理PythonQt集成。例如,在PythonQtWrapper中,我應該從指針返回什麼?如果我正在處理python中的指針,我怎樣才能調用其他帶有智能指針而不是普通指針的函數?我需要將智能指針暴露給PythonQt嗎?看來,在boost :: python中,很多智能指針都被自動處理了。我的情況需要做什麼?我應該在C++中添加接受非智能指針的附加函數嗎?它們只需將指針包裝在智能指針中並將其發送到智能指針接受函數?看起來python API在指針所有權方面有一些相當複雜的規則。

class PythonQtWrapper_SomeClass : public QObject 
{ 
    Q_OBJECT 
public slots: 
    SomeClass* new_SomeClass() { return new SomeClass(); } 
    void delete_Mesh(SomeClass* obj) { delete obj; } 
    SomeClass* static_SomeClass_build(int foo) { 
     SomeClassP ack = SomeFactory::build(foo); 
     return ? 
    } 
}; 

回答

1

我們有這個確切的同樣的問題,並沒有一個很好的解決方案呢。

之前採取了添加funcs的變體,而不是返回原始指針。然後我們擺脫了這些,現在我們用PythonQt裝飾智能指針,py代碼可以調用.get()來獲取原始指針。這就是我剛剛作出了一個第一次實驗切換到風格:(從https://github.com/realXtend/naali/commit/e72cb827c7fcbaee27b8258e616ee7bd2835fbd7

//Ptr conversions, not automatic but with an explicit call 
int scenePtr_id = qRegisterMetaType<ScenePtr>("ScenePtr"); 
QObject* TundraDecorator::get(ScenePtr* self) 
{ 
    return self->get(); 
} 

我不知道這是連安全的,但似乎工作。如果有更好的解決方案,我非常感興趣。