2017-06-01 36 views
1

我有一個C++類myClass,我試圖讓一個創建者基於numpy數組。將numpy對象傳遞給pythonqt包裝器

這裏是定義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*但我得到相同的錯誤。

每個其他創作者的作品。

我錯過了什麼?

+0

你可以嘗試傳遞一個簡單的Python對象,就像一個字符串?它會調用你的函數還是聲稱它不匹配?它看起來像系統希望PyObject沒有指針「*」,這是不好的。 –

回答

0

我張貼在這裏我直接從PythonQt developper得到了答案,萬一有人得到了同樣的問題:

簡短的回答是,該方法返回一個nullptr和Qt元系統進行檢測(我不知道知道如何),並沒有調用該方法。

通過用通用構造函數替換return nullptr(例如return new myClass())解決了這個問題。