QVariant suche genaue Beschreibung

Verschiedenes zu Qt
Antworten
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

QVariant suche genaue Beschreibung

Beitrag von The User »

Hallo!
Gibt es eine umfassende Beschreibung von der Funktionsweise von QVariant?

Danke im Voraus!
The User
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Die doku dazu?
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

Beitrag 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.
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag 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
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

Beitrag von The User »

Funktionsweise != Benutzung ;)

Es geht mir darum, ob man eigene Typen in QVariant konvertierbar machen kann.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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 :)
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

Beitrag 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. :(
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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...
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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...
The User
Beiträge: 62
Registriert: 11. Dezember 2008 23:48

Beitrag von The User »

Aber es gibt wirklich keine Möglichkeit toDouble für den eigenen Typ zu ermöglichen, oder?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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...
Antworten