将QStandardItemModel转换为QVariant

时间:2011-11-26 15:57:33

标签: qt qobject qvariant

我正在尝试将一个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派生的,我认为它已经是寄存器

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(场景) {     类_( “场景”); }

1 个答案:

答案 0 :(得分:1)

是的,默认情况下,QVariant可以使用以下类型中的一种 - http://doc.qt.io/qt-4.8/qvariant.html#Type-enum - 并且它们不足以完成您的任务。您应该通过qmetatype系统自己声明其他类型。因此,你应该调用qRegisterMetaType()函数。