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
risposta
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;
// ...
}
Ho perso completamente il valore '
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;
}
Si potrebbe utilizzare QStringList invece di QPair per ospitare i due numeri interi. QStringList può essere convertito in QVariant. – user2672165
Ok, questa è una soluzione semplice, avrei dovuto saperlo da solo -> head -> desk ... –
Yiiikes @ _string_ list per una coppia _integer_! – lpapp