Передача numy объекта в оболочку pythonqt

У меня есть класс с ++ myClass и я пытаюсь создать создателя на основе массива.

Вот обертка, определяющая new_ создатель питона 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* но я получаю ту же ошибку.

Любой другой создатель работает.

Что мне не хватает?

1 ответ

Я публикую здесь ответ, полученный непосредственно от разработчика PythonQt, на случай, если кто-то получит такую ​​же проблему:

Короткий ответ: метод возвращал nullptr и метасистема Qt обнаруживала (я не знаю как) и не вызывала метод.

Заменяя return nullptr с общим конструктором (например, return new myClass()) решает проблему.

Другие вопросы по тегам