2014-12-13 17 views
5

Ich habe folgendes Problem: Ich möchte Daten über TCP übertragen, und schrieb eine Funktion dafür. Für eine maximale Wiederverwendbarkeit ist die Funktionsvorlage f(QPair<QString, QVariant> data). Der erste Wert (aka QString) wird vom Empfänger als Zieladresse verwendet, der zweite enthält die Daten. Jetzt möchte ich einen QPair<int, int>-Wert übertragen, aber leider kann ich keinen QPair in einen QVariant konvertieren. Das Optimum wäre, ein Paar int-Werte übertragen zu können, ohne eine neue Funktion schreiben zu müssen (oder die alte zu überladen). Was ist in diesem Fall die beste Alternative für QPair?Convert QPair zu QVariant

+1

Sie QStringList statt QPair verwenden könnte, die beiden Zahlen zu hosten. QStringList kann in QVariant konvertiert werden. – user2672165

+0

Ok, das ist eine einfache Lösung, ich hätte das für mich selbst wissen sollen -> Kopf -> Schreibtisch ... –

+2

Yiiikes @ _string_ Liste für ein _integer_ Paar! – lpapp

Antwort

12

Sie haben die spezielle Makro Q_DECLARE_METATYPE() verwenden, um benutzerdefinierte Typen zur Verfügung zu QVariant System. Please read the doc carefully zu verstehen, wie es funktioniert.

Für QPair obwohl es ganz einfach:

#include <QPair> 
#include <QDebug> 

typedef QPair<int,int> MyType; // typedef for your type 
Q_DECLARE_METATYPE(MyType);  // makes your type available to QMetaType system 

int main(int argc, char *argv[]) 
{ 
    // ... 

    MyType pair_in(1,2); 
    QVariant variant = QVariant::fromValue(pair_in); 
    MyType pair_out = variant.value<MyType>(); 
    qDebug() << pair_out; 

    // ... 
} 
+0

Ich habe den 'Wert ()' in der 'QVariant'-Dokumentation komplett verpasst, da ich tatsächlich ein Paar verwende, um' QAction'-Daten zu liefern. Dein Beitrag wird sehr geschätzt. +1 – rbaleksandar

2

Hinweis: Diese Antwort verwendet eine andere Funktionen, um sie zu konvertieren, etwas, das Sie in Betracht ziehen können.

könnten Sie QDataStream verwenden, um die QPair-QByteArray und dann wandeln sie in QVariant serialisiert werden, und Sie können die inverse Prozess die QPair von einem QVariant zu bekommen.

Beispiel:

//Convert the QPair to QByteArray first and then 
//convert it to QVariant 
QVariant tovariant(const QPair<int, int> &value) 
{ 
    QByteArray ba; 
    QDataStream stream(&ba, QIODevice::WriteOnly); 
    stream << value; 
    return QVariant(ba); 
} 

//Convert the QVariant to QByteArray first and then 
//convert it to QPair 
QPair<int, int> topair(const QVariant &value) 
{ 
    QPair<int, int> pair; 
    QByteArray ba = value.toByteArray(); 
    QDataStream stream(&ba, QIODevice::ReadOnly); 
    stream >> pair; 
    return pair; 
}