2014-12-13 11 views
5

Ho il seguente problema: Voglio trasmettere i dati via TCP e ho scritto una funzione per questo. Per la massima riusabilità il modello di funzione è f(QPair<QString, QVariant> data). Il primo valore (alias QString) viene utilizzato dal destinatario come indirizzo di destinazione, il secondo contiene i dati. Ora voglio trasferire un valore QPair<int, int>, ma sfortunatamente non riesco a convertire un QPair in un QVariant. L'optimum sarebbe essere in grado di trasferire una coppia di valori int senza dover scrivere una nuova funzione (o per sovraccaricare quella precedente). Qual è la migliore alternativa per QPair in questo caso?Converti QPair in QVariant

+1

Si potrebbe utilizzare QStringList invece di QPair per ospitare i due numeri interi. QStringList può essere convertito in QVariant. – user2672165

+0

Ok, questa è una soluzione semplice, avrei dovuto saperlo da solo -> head -> desk ... –

+2

Yiiikes @ _string_ list per una coppia _integer_! – lpapp

risposta

12

Devi usare lo speciale macro Q_DECLARE_METATYPE() per rendere i tipi personalizzati a disposizione del sistema QVariant. Please read the doc carefully per capire come funziona.

Per QPair Anche se è abbastanza semplice:

#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

Ho perso completamente il valore '()' nella documentazione di 'QVariant' dato che in realtà sto usando una coppia per fornire alcuni dati' QAction'. Il tuo post è molto apprezzato +1 – rbaleksandar

2

Nota: questa risposta utilizza un'altra funzione per convertirli, qualcosa che potresti prendere in considerazione.

Si potrebbe utilizzare QDataStream per serializzare l'QPair-QByteArray e quindi convertirlo in QVariant, ed è possibile il processo inverso per ottenere il QPair da un QVariant.

Esempio:

//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; 
}