Преобразовать QStandardItemModel в QVariant - PullRequest
1 голос
/ 26 ноября 2011

Я пытаюсь отправить производный от QStandardItemModel объект в PythonQt, но меня немного смущает, как его нужно отправлять.Когда я использовал boost :: python, у меня было несколько элементов управления, таких как boost :: noncopyable, чтобы гарантировать, что я не воссоздаю этот объект, а делюсь им с python.У меня также были конструкции для предоставления общего разделяющего указателя на python изнутри python.

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))

Что меня сейчас смущает, так это как я могу доставить мой объект в python через QVariant.Так как он получен из 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 Ответ

1 голос
/ 26 ноября 2011

Да, по умолчанию QVariant может принимать один из следующих типов - http://doc.qt.io/qt-4.8/qvariant.html#Type-enum - и их недостаточно для вашей задачи. Вы должны объявить дополнительные типы самостоятельно через систему qmetatype. Таким образом, вы должны вызвать функцию qRegisterMetaType().

...