QVariant::Handler::canConvert



  • Man kann den QVariant::handler überschreiben. Mach ich auch. Da gibts paar Funktionszeigen, z.B. compare und convert. Was ich damit schon mal erreichen konnte, was QVariant::toString für benutzerdefinierte Datentypen implementieren.

    Was jetzt aber nicht geht, ist QVariant.convert, vor allem QVariant(QString) -> UserType. Weil convert zuerst canConvert aufruft, und das benutzt QVariant::Handler::canConvert nicht. Überhaupt wird die Funktion niemals aufgerufen, wenn ich das richtig sehe.
    Irgendwelche Ideen?

    Was ich vor allem erreichen will, ist das "Laden" von benutzerdefinierten Datentypen aus Strings, die ich z.B. aus einer XML lese und dann über setProperty zuweise.
    Ich habs jetzt zwar schon gelöst, in dem ich mir selber die QMetaProperty aus dem QMetaObject hole und den QVariant über einen eigenen Mechanismus konvertiere, wobei ich canConvert umgehe. Das ist aber eben zusätzlicher Code und einfach ein setProperty wär natürlich schöner.


  • Mod

    Hab ich direkt noch nichts mit machen müssen, aber canConvert scheint nichts darüber auszusagen, ob der Inhalt konvertiert werden kann, sondern nur der Typ:

    http://qt-project.org/doc/qt-5.0/qtcore/qvariant.html#using-canconvert-and-convert-consecutively



  • Ja ja, ich weiß. Das Problem ist aber, dass Qt das intern aufruft. Also, Code in QObject::setProperty in etwa:

    int metaTypeId = getPropertyMetaTypeId();
    value.convert(metaTypeId);
    

    Und QVariant::convert macht dann in etwa folgendes:

    QVariant oldValue = *this;
    clear();
    if (!oldValue.canConvert(type))
      return false;
    

    D.h., ungeachtet dessen, dass die Konvertierung eigentlich funktionieren würde, weil mein Handler das kann, geht convert sofort raus, weil canConvert den Handler nicht aufruft und meint, es geht nicht. Ich würd ja gern auf das canConvert verzichten, aber ich seh keine Möglichkeit, das zu umgehen.

    Außer natürlich, die Qt umzubauen, aber darauf würde ich gern verzichten. Wir haben eh schon so viel umgebaut, dass ein Umstieg auf eine aktuellere Version sehr schwierig ist, und das wäre so ein potenzieller Fehler, den man leicht übersieht, weil dann kompiliert, aber dann irgendwas nicht funktioniert weil das Verhalten plötzlich wieder anders ist.


Log in to reply