2011-11-29 96 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(); 
} 

我不知道这是连安全的,但似乎工作。如果有更好的解决方案,我非常感兴趣。