[Interest] QVariant cannot take custom type

Aekold Helbrass helbrass at gmail.com
Fri Apr 5 10:01:08 CEST 2013


I've provided copy-constructor, as was suggested in that article.


On Fri, Apr 5, 2013 at 10:50 AM, Samuel Gaist <samuel.gaist at edeltech.ch>wrote:

> Hi,
>
> IIRC, you can't have Item or Holder in a QVariant because there QObject so
> the copy constructor is disabled for them.
>
> This thread might be of interest
> http://stackoverflow.com/questions/7872578/how-to-properly-use-qregistermetatype-on-a-class-derived-from-qobject
>
> Hope it helps
>
> On 5 avr. 2013, at 09:37, Aekold Helbrass wrote:
>
> > Hi All!
> >
> > Short story is: I'm trying to put custom type into QVariant and it
> doesn't work, on debug I see QVariant with value <not accessible> and
> trying to read it I'm getting segfault.
> >
> > Long story, I'm new to Qt/C++ so I'm trying to do everything very
> carefully, but I'm almost sure it's some rookie mistake in my code. This
> code started as attempt to bind JSON tree to object tree, and stopped on
> reading of QList, because QMetaProperty wants QVariant.
> >
> > Source code:
> > ================ main.cpp ====================
> > #include <QCoreApplication>
> > #include <QObject>
> > #include <QList>
> > #include <QMetaType>
> > #include <QMetaObject>
> > #include <QMetaProperty>
> > #include <QDebug>
> >
> > #include "item.h"
> > #include "holder.h"
> >
> > Q_DECLARE_METATYPE(Item)
> > Q_DECLARE_METATYPE(Item*)
> > Q_DECLARE_METATYPE(Holder)
> >
> > int main(int argc, char *argv[]) {
> >     QCoreApplication a(argc, argv);
> >
> >     int typeItem = qRegisterMetaType<Item>("Item");
> >     int typeHolder = qRegisterMetaType<Holder>("Holder");
> >     int typeItemList = qRegisterMetaType<QList<Item*> >("QList<Item*>>");
> >     int typeItemPointer = qRegisterMetaType<Item*>("Item*");
> >
> >     QList<QVariant> list;
> >     for (int i = 0; i < 10; i++) {
> >         void* created = QMetaType::create(typeItem);
> >         Item* item = static_cast<Item*>(created);
> >         item->setName("item " + i);
> > // attempt 1:
> >         QVariant var(typeItem, created);
> > // attempt 2:
> >         //QVariant var;
> >         //var.setValue(item);
> > // attempt 3:
> >         //QVariant var = QVariant::fromValue(item);
> >         list.append(var);
> >     }
> >
> >     Holder* holder = new Holder();
> >     int index = holder->metaObject()->indexOfProperty("items");
> >     QMetaProperty property = holder->metaObject()->property(index);
> >     property.write(holder, list);
> >
> >     QList<Item*> items = holder->items();
> >     for (int i = 0; i < items.size(); i++) {
> >         Item* item = items.at(i);
> >         qDebug() << "name: " << item->name();
> >     }
> >
> >     return a.exec();
> > }
> >
> > ======================================= holder.h
> ===============================
> > #ifndef HOLDER_H
> > #define HOLDER_H
> >
> >
> > #include <QObject>
> >
> > #include <QList>
> > #include "item.h"
> >
> > class Holder : public QObject {
> >
> >     Q_OBJECT
> >     Q_PROPERTY(QList<Item*> items READ items WRITE setItems)
> >
> > public:
> >     Holder(QObject* parent=0) : QObject(parent) {}
> >
> >     Holder(const Holder& copy, QObject* parent=0) : QObject(parent) {
> >
> >         pItems = copy.items();
> >
> >     }
> >     Holder& operator =(const Holder& value) {
> >
> >         pItems = value.items();
> >
> >     }
> >     QList<Item*> items() const {
> >
> >         return pItems;
> >
> >     }
> > public slots:
> >
> >     void setItems(const QList<Item*>& value) {
> >
> >         pItems = value;
> >
> >     }
> > private:
> >
> >     QList<Item*> pItems;
> >
> > };
> >
> > #endif // HOLDER_H
> >
> >
> >
> > ============================== item.h ================================
> > #ifndef ITEM_H
> >
> > #define ITEM_H
> >
> > #include <QObject>
> >
> > class Item : public QObject {
> >
> >     Q_OBJECT
> >     Q_PROPERTY(QString name READ name WRITE setName)
> >
> > public:
> >     Item(QObject* parent=0) : QObject(parent) {}
> >
> >     Item(const Item& copy, QObject* parent=0) : QObject(parent) {
> >
> >         pName = copy.name();
> >
> >     }
> >     Item& operator =(const Item& value) {
> >
> >         pName = value.name();
> >
> >     }
> >     QString name() const {
> >
> >         return pName;
> >
> >     }
> >
> > public slots:
> >
> >     void setName(const QString& value) {
> >
> >         pName = value;
> >
> >     }
> > private:
> >
> >     QString pName;
> >
> > };
> >
> > #endif // ITEM_H
> >
> >
> >
> > ======================== end ===================================
> > _______________________________________________
> > Interest mailing list
> > Interest at qt-project.org
> > http://lists.qt-project.org/mailman/listinfo/interest
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20130405/e373180a/attachment.html>


More information about the Interest mailing list