【问题标题】:Smart pointers with PythonQt使用 PythonQt 的智能指针
【发布时间】:2011-11-29 15:49:41
【问题描述】:

我的应用在整个 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 ?
   }
};

【问题讨论】:

    标签: c++ python qt smart-pointers


    【解决方案1】:

    我们也遇到了同样的问题,但还没有很好的解决方案。

    之前求助于添加返回原始指针的函数变体。然后我们摆脱了这些,现在在 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();
    }
    

    我不确定这是否安全,但似乎有效。如果有更好的解决方案,我很感兴趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 2020-12-04
      相关资源
      最近更新 更多