我的应用程序在整个C ++ API中使用QSharedPointers,而不是返回一个对象,它通常会返回一个智能指针,为方便起见,每个类都有一个附带的typedef。
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 ?
}
};
答案 0 :(得分:1)
我们遇到了同样的问题,但还没有很好的解决方案。
早先使用添加返回原始指针的func变体。然后我们摆脱了那些,现在我在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();
}
我不确定这是否安全,但似乎有效。如果有更好的解决方案,我们会非常感兴趣。