我试图发送一个qstandarditemmodel派生对象到PythonQt,但我对它需要如何发送有点困惑。当我使用boost::python时,我有几个像boost::noncopyable这样的控件来确保我不是重新创建这个对象,而是与python共享它。我还构建了一个从python内部指向python的boost共享指针。
class Scene : public boost::enable_shared_from_this<Scene>, public QStandardItemModel
在PythonQt,然而,我不确定什么是可用的。函数call
接受一个QVariantList来表示所有的函数参数。
QVariant PythonQt::call(PyObject* object, const QString &callable, const QVariantList &args = QVariantList))
我现在感到困惑的是如何通过QVariant获得我的对象到python。由于它派生自QStandardItemModel,我认为它应该已经是register
void MyObject::someFunction(QString fileName)
{
QVariant myObjectV = qVariantFromValue(this);
// send to python
...
}
但是这给了我以下错误:
'qt_metatype_id' : is not a member of 'QMetaTypeId<MyObject>'
我已经尝试在我声明我的类之后注册它,但这会抛出一个不同的错误。
class MyObject : public QStandardItemModel
{
Q_OBJECT
...
};
Q_DECLARE_METATYPE(MyObject)
QStandardItemModel::QStandardItemModel(const QStandardItemModel&) is private within this context.
我实际上得到了两次错误——一次在头中,我添加了Q_DECLARE_METATYPE,另一次在头中,它有一个类,它总是派生自QStandardItemModel,但在其他方面是不相关的。
是Q_DECLARE_METATYPE甚至正确的方式去转换这个对象到QVariant?
BOOST_PYTHON_MODULE(场景){class_("场景");}
是的,默认情况下,QVariant
可以采用以下类型之一- http://doc.qt.io/qt-4.8/qvariant.html#Type-enum -但它们不足以满足您的任务。您应该通过qmetatype系统自己声明其他类型。因此,您应该调用qRegisterMetaType()
函数。