1

我有一个 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*但我得到了同样的错误。

每个其他创作者都在工作。

我错过了什么?

4

1 回答 1

1

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

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

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

于 2017-06-02T11:34:25.550 回答