Seite 1 von 1

QVariant suche genaue Beschreibung

Verfasst: 17. Juni 2009 14:42
von The User
Hallo!
Gibt es eine umfassende Beschreibung von der Funktionsweise von QVariant?

Danke im Voraus!
The User

Verfasst: 17. Juni 2009 14:48
von Mani99
Die doku dazu?

Verfasst: 17. Juni 2009 19:05
von The User
Also dort steht nicht viel.
Mit Source und QMetaType versteht man zumindest die Speicherung.
Interessant wäre, wie die Konvertierungen vorgenommen werden.

Verfasst: 17. Juni 2009 19:27
von -=Freaky=-
The User hat geschrieben:Also dort steht nicht viel.
Mit Source und QMetaType versteht man zumindest die Speicherung.
Interessant wäre, wie die Konvertierungen vorgenommen werden.
http://doc.qtsoftware.com/4.5/qvariant.html#canConvert
http://doc.qtsoftware.com/4.5/qvariant.html#convert
http://doc.qtsoftware.com/4.5/qvariant.html#value

da stehen doch sogar beispielcodes.

mfg,
julian

Verfasst: 17. Juni 2009 20:36
von The User
Funktionsweise != Benutzung ;)

Es geht mir darum, ob man eigene Typen in QVariant konvertierbar machen kann.

Verfasst: 17. Juni 2009 20:44
von franzf
The User hat geschrieben:Funktionsweise != Benutzung ;)

Es geht mir darum, ob man eigene Typen in QVariant konvertierbar machen kann.
Funktionsweise wäre für mich "Es existiert ein void-Pointer, in dem die Daten abgespeichert werden" oder der gleichen.
Eigene Typen registrieren gehört zur Benutzung.

Aber egal. QMetaType suchst du.
Schau dir die Doku zu Q_DECLARE_METATYPE an, da ist sogar ein ausführliches Beispiel dabei :)

Verfasst: 17. Juni 2009 22:31
von The User
Ich habe es schlecht formuliert.
Aber ich glaube es geht nicht, einen eigenen Typ in QVariant zu speichern und z.B. nach double konvertierbar machen. :(

Verfasst: 17. Juni 2009 23:04
von upsala
Du hast bis jetzt überhaupt nichts formuliert, sonder läst jeden hier blos rumraten.
Außerdem scheinst du bis jetzt selbst weder die angegeben Doku gelesen noch eigenen Code geschrieben zu haben.
Und was du wohin konvertieren willst schreibst du auch nicht...

Verfasst: 18. Juni 2009 17:34
von The User
Lassen wir das einfach gut sein...
Ich habe einiges an Quellcode geschrieben und es geht jetzt auf anderm Wege.
Die Doku gibt nun einmal wenig Information über das Speicherformat von QVariant u.ä., natürlich habe ich die gelesen, ebenso wie die von QMetaType. Mit dem Quellcode bin ich dahinter gekommen, dass es wohl unmöglich ist.

Verfasst: 18. Juni 2009 18:19
von franzf
Ja, das ist unmöglich. Weil canConvert per Default (und das ist bei nicht-Qt-Standard-Typen so) ein false zurück gibt.

Du hast jetzt z.B. die Möglichkeit, dir eigene Operatoren zu definieren, mit denen du deinen Typ dann in einen anderen Typen casten kannst.

Z.B. hast du einen Typ "Angle"

Code: Alles auswählen

#include <iostream>
#include <sstream>
#include <string>

class Angle
{
    public:
        Angle(int deg=0, int min=0, int sec=0)
         : m_deg(deg), m_min(min), m_sec(sec)
        {
        }
        operator double() const
        {
            return m_deg*1.0 + m_min/60.0 + m_sec/3600.0;
        }
        operator std::string() const
        {
            std::stringstream s;
            s << m_deg << "° " << m_min << "\'" << m_sec << "\"";
            return s.str();
        }
    protected:
        int m_deg, m_min, m_sec;
};

int main()
{
    Angle a1(20, 15, 23);
    std::cout << static_cast<std::string>(a1) << std::endl;
    std::cout << static_cast<double>(a1) << std::endl;
    double da1 = a1 + 10.0;
    std::cout << da1 << std::endl;
    return 0;
}
So sparst du dir Methoden ala "toDouble()" oder "toString", auch wenn es eigentlich wurscht ist.
Aber wenn du nix gegen implizite Typkonvertierung hast (a1+10.0) ist es sogar recht praktisch...

Verfasst: 18. Juni 2009 19:29
von The User
Aber es gibt wirklich keine Möglichkeit toDouble für den eigenen Typ zu ermöglichen, oder?

Verfasst: 19. Juni 2009 09:43
von franzf
The User hat geschrieben:Aber es gibt wirklich keine Möglichkeit toDouble für den eigenen Typ zu ermöglichen, oder?
Nein, es geht nicht, wie du eh schon selber gesehen hast, und ich auch noch mal geschrieben hab...