【问题标题】:Convert a QStandardItemModel to a QVariant将 QStandardItemModel 转换为 QVariant
【发布时间】:2011-11-26 15:57:33
【问题描述】:

我正在尝试将 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(场景) { class_("场景"); }

【问题讨论】:

    标签: qt qobject qvariant


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多