Программирование Qt: как использовать пользовательский тип данных в QVariantMap?

Я пишу приложение Qt, которое сопоставляет класс C++ с объектом Javascript в QtWebkit. Сначала позвольте мне объяснить, что я пытаюсь сделать:

У меня есть класс, унаследованный от QObject:

class myobj : public QObject {
    Q_OBJECT
public:
    myobj();
    ~myobj();

pulbic slots:
    void getData();
}

А в другом классе я попытался добавить экземпляры myobj в QVariantMap:

QVariantMap anotherClass::getObj() {
    myobj* obj1 = new myobj();
    myobj* obj2 = new myobj();

    QVariantMap items;

    items.insert(QString("0"), QVariant(*obj1));
    items.insert(QString("1"), QVariant(*obj2));

    return items;
}

И тут я получил следующую ошибку:

error: no matching function for call to ‘QVariant::QVariant(myobj&)’

Итак, я попытался добавить объявления:

Q_DECLARE_METATYPE(myobj);

Но я получил:

error: ‘QObject::QObject(const QObject&)’ is private

Любая идея об этом?


person Mickey Shine    schedule 29.11.2010    source источник


Ответы (2)


Как сказал компилятор, не существует конструктора QVariant, который принимает myobj в качестве параметра. Пробовали ли вы вместо этого использовать функцию qVariantFromValue?

Я думаю, это то, что вы ищете.

person Patrice Bernassola    schedule 29.11.2010
comment
Я также пробовал это: конструктор копирования"> stackoverflow.com/questions/956335/, но, похоже, все еще не работает - person Mickey Shine; 29.11.2010
comment
Как объясняется здесь (doc.trolltech.com/4.7/qmetatype.html#Q_DECLARE_METATYPE) вы должны объявить общедоступный конструктор по умолчанию, общедоступный конструктор копии и общедоступный деструктор. У вас нет конструктора копирования. Таким образом, компилятор пытается использовать один из материнских классов (QObject), который был объявлен как частный. - person Patrice Bernassola; 29.11.2010
comment
QObjects и QVariant плохо сочетаются друг с другом, так как предполагается, что варианты values копируются, а QObjects — нет. - person Frank Osterfeld; 29.11.2010
comment
Пример в описании функции qVariantFromValue выполняется с QObject. Так что думаю это не проблема - person Patrice Bernassola; 29.11.2010

Если вы зарегистрируете свой пользовательский тип с помощью Q_DECLARE_METATYPE(myobj), вашему классу потребуется открытый конструктор по умолчанию (хорошо), открытый деструктор (хорошо) и открытый конструктор копии (ОТСУТСТВУЕТ, о чем вам сообщает сообщение об ошибке), см. документация.

person hmuelner    schedule 29.11.2010