我正在尝试将一个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(场景) { 类_( “场景”); }
答案 0 :(得分:1)
是的,默认情况下,QVariant
可以使用以下类型中的一种 - http://doc.qt.io/qt-4.8/qvariant.html#Type-enum - 并且它们不足以完成您的任务。您应该通过qmetatype系统自己声明其他类型。因此,你应该调用qRegisterMetaType()
函数。