将 numpy 对象传递给 pythonqt 包装器

Posted

技术标签:

【中文标题】将 numpy 对象传递给 pythonqt 包装器【英文标题】:Passing numpy object to pythonqt wrapper 【发布时间】:2017-06-01 12:00:25 【问题描述】:

我有一个 c++ 类 myClass,我正在尝试创建一个基于 numpy 数组的创建者。

这是定义 new_ python 创建者的包装器,以 PyObject 作为参数:

class myClassPyWrapper : public QObject 
    Q_OBJECT

public slots:
/*... many other creators here ...*/
    myClass* new_myClass(PyObject* my_py_obj)
        if (PyArray_Check(my_py_obj)) 
            //do something
        
        return nullptr;
    

但是当我键入时,不会从 Python 中调用创建者:

a=np.array(np.zeros(100)).reshape(10,10)
b=myClass(a)

我明白了:

py> a=np.array(np.zeros(100)).reshape(10,10)
py> b=myClass(a)
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ValueError: Could not find matching overload for given arguments:
(array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]]),)
 The following slots are available:
myClass() -> myClass
myClass(PyObject my_py_obj) -> myClass
myClass(myClass) -> myClass
myClass(int, int) -> myClass
myClass(int, int, double val) -> myClass
myClass(int, int, double val, QString name) -> myClass
myClass(QVector<double>, QPair<int,int>) -> myClass

我尝试将Pyobject* 替换为PyArrayObject*,但我得到了同样的错误。

所有其他创作者都在工作。

我错过了什么?

【问题讨论】:

你能尝试传递一个简单的 Python 对象,比如字符串吗?它是调用你的函数还是声称它不匹配?看起来系统需要没有指针 * 的 PyObject,这不好。 【参考方案1】:

我在这里发布我直接从 PythonQt 开发者那里得到的答案,以防有人遇到同样的问题:

简短的回答是该方法正在返回一个nullptr,并且 Qt 元系统正在检测(我不知道如何)并且没有调用该方法。

通过将return nullptr 替换为通用构造函数(例如return new myClass())可以解决问题。

【讨论】:

以上是关于将 numpy 对象传递给 pythonqt 包装器的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给夹具函数

将 python 函数传递给 SWIG 包装的 C++ 代码

通过 HOC 将 React 上下文传递给包装的组件

如何将 std::function 对象传递给采用函数指针的函数?

使用 SWIG 控制器将 python 中的 numpy 函数传递给 C++

将 $db 对象传递给其他类,以便它们可以访问数据库