У меня есть класс с ++ 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*
но я получаю ту же ошибку.
Любой другой создатель работает.
Что мне не хватает?
Я публикую здесь ответ, полученный непосредственно от разработчика PythonQt, на случай, если кто-то получит такую же проблему:
Короткий ответ: метод возвращал nullptr
и метасистема Qt обнаруживала (я не знаю как) и не вызывала метод.
Заменяя return nullptr
с общим конструктором (например, return new myClass()
) решает проблему.
Других решений пока нет …