Seite 1 von 1

[gelöst] QVariant eines QStandardItems?

Verfasst: 14. August 2014 10:04
von kalsan
Hallo allerseits,
Ich versuche, eine eigene Unterklasse eines QStandardItems in data() eines anderen Items derselben Klasse einzufügen.
Dazu habe ich folgendes probiert:

Code: Alles auswählen

void MeinStandardItem::eineFunktion(MeinStandardItem *einItem){
QVariant* variant=new QVariant(einItem);
setData(variant,EIGENE_ROLLE_UEBER_32);
}
Leider geht das nicht:

Code: Alles auswählen

/usr/include/qt/QtCore/qvariant.h:466: Fehler: 'QVariant::QVariant(void*)' is private
     inline QVariant(void *) Q_DECL_EQ_DELETE;
            ^
Als Kontext wird die obere Zeile angezeigt, und es heisst:

Code: Alles auswählen

blah.cpp:11: Fehler: use of deleted function 'QVariant::QVariant(void*)'
Dann nochmals dasselbe für die untere Zeile.
MeinStandardItem erbt jetzt auch von QObject, aber das Verhalten ist immer noch dasselbe.
Was ist da falsch? Ich möchte darauf hinweisen, dass ich tatsächlich ein Objekt als Datenfeld des anderen speichern möchte, und nicht als Kind (denn das hat in meiner Datenstruktur eine andere Bedeutung).
lg
Kalsan

Re: QVariant eines QStandardItems?

Verfasst: 14. August 2014 10:19
von archer
Ich vertstehe zwar nicht ganz was du machen willst aber, Wenn du QStandardItem erweitern
möchtest musst du auch von diesem erben.

Code: Alles auswählen

class MeinStandardItem : public QStandardItem 
Und dann solltest du kein new auf das QVariant machen.

Code: Alles auswählen

QVariant variant(einItem);
setData(variant,EIGENE_ROLLE_UEBER_32);
Aber ich glaube dein eigentliches Problem ist, das QVariant mit dem Datentyp MeinStandardItem* nichts
anfangen kann. Dazu solltest du mal in Richtung Q_DECLARE_METATYPE() schauen.

Re: QVariant eines QStandardItems?

Verfasst: 14. August 2014 11:32
von kalsan
Vielen Dank für deine Antwort. MeinStandardItem erbt bereits von QStandardItem und von QObject.
Nach den folgenden Schritten funktioniert das Compilen:
1. Q_OBJECT und Q_DECLARE_METATYPE im .h löschen
2. Folgende Änderungen in der Funktion:

Code: Alles auswählen

void MeinStandardItem::eineFunktion(MeinStandardItem *einItem){
    QVariant variant;
    variant.setValue(einItem);
    setData(variant,EIGENE_ROLLE_UEBER_32);
}
Nun stürzt das Programm ab. Ich gehe aber davon aus, dass ich einen weiteren Fehler andernorts gemacht habe. Oder hat das mit meinem aktuellen Code zu tun?
lg
Kalsan

Re: QVariant eines QStandardItems?

Verfasst: 15. August 2014 08:04
von archer
Warum muß dein MeinStandardItem von QObject erben?
Ich würde das eher nicht tun, da ein QStandardItem ja nur Daten verwalten soll.
Ein QStandardItem wird ja auch ständig hin- und herkopiert, ein QObject nicht.

Re: QVariant eines QStandardItems?

Verfasst: 16. August 2014 09:47
von kalsan
Wenn ich das nicht tue, geschieht folgendes:

Code: Alles auswählen

/usr/include/qt/QtCore/qmetatype.h:1615: Fehler: static assertion failed: Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known to Qt's meta-object system
     Q_STATIC_ASSERT_X(QMetaTypeId2<T>::Defined, "Type is not registered, please use the Q_DECLARE_METATYPE macro to make it known to Qt's meta-object system");
     ^
/usr/include/qt/QtCore/qmetatype.h:1476: Fehler: 'qt_metatype_id' is not a member of 'QMetaTypeId<HBlock*>'
     static inline Q_DECL_CONSTEXPR int qt_metatype_id() { return QMetaTypeId<T>::qt_metatype_id(); }
                                                                                                 ^
/usr/include/qt/QtCore/qmetatype.h:1476: Fehler: body of constexpr function 'static constexpr int QMetaTypeId2<T>::qt_metatype_id() [with T = HBlock*]' not a return-statement
     static inline Q_DECL_CONSTEXPR int qt_metatype_id() { return QMetaTypeId<T>::qt_metatype_id(); }
                                                                                                    ^

Re: QVariant eines QStandardItems?

Verfasst: 18. August 2014 10:22
von archer
Wie sieht denn dein Quellcode jetzt aus?

Re: QVariant eines QStandardItems?

Verfasst: 18. August 2014 22:06
von kalsan
.h:

Code: Alles auswählen

class MeinStandardItem: public QStandardItem, public QObject
{
public:
MeinStandardItem(QString new_name);
~MeinStandardItem;
void eineFunktion(MeinStandardItem *einItem);
};
.cpp:

Code: Alles auswählen

MeinStandardItem::MeinStandardItem(QString new_name){
  setData(new_name,Qt::DisplayRole);
}
MeinStandardItem::~MeinStandardItem{}
void MeinStandardItem::eineFunktion(MeinStandardItem *einItem){
    QVariant variant;
    variant.setValue(einItem);
    setData(variant,EIGENE_ROLLE_UEBER_32);
}

Re: QVariant eines QStandardItems?

Verfasst: 19. August 2014 08:36
von archer
Also, um das von dir zu verwenden müßte ich es so umschreiben:
.h

Code: Alles auswählen

class CMeinStandardItem : public QStandardItem
{
public:

    CMeinStandardItem();
    CMeinStandardItem(QString new_name);
    ~CMeinStandardItem();
    void eineFunktion(CMeinStandardItem *einItem);

    static const int EIGENE_ROLLE_UEBER_32 = Qt::UserRole +1;
};

Q_DECLARE_METATYPE(CMeinStandardItem*)
.cpp

Code: Alles auswählen

CMeinStandardItem::CMeinStandardItem()
    : QStandardItem()
{
}

CMeinStandardItem::CMeinStandardItem(QString new_name)
    : QStandardItem()
{
      setData(new_name,Qt::DisplayRole);
}

CMeinStandardItem::~CMeinStandardItem()
{
}

void CMeinStandardItem::eineFunktion(CMeinStandardItem *einItem)
{
    QVariant variant;
    variant.setValue(einItem);
    setData(variant, EIGENE_ROLLE_UEBER_32);
}

Re: QVariant eines QStandardItems?

Verfasst: 21. August 2014 18:22
von kalsan
Ach ja, natürlich. Ich habe wohl mal wieder vorschnell drauflosgetippt und nicht darauf geachtet, was es ist.
Vielen Dank für die Berichtigung! Jetzt ist endlich alles sauber.
Der Absturz war übrigens aufgrund eines nicht initialisierten Feldes (andernorts).
Herzlichen Dank für die Hilfe!