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
Antwort
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;
// ...
}
Ich habe den 'Wert
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;
}
Sie QStringList statt QPair verwenden könnte, die beiden Zahlen zu hosten. QStringList kann in QVariant konvertiert werden. – user2672165
Ok, das ist eine einfache Lösung, ich hätte das für mich selbst wissen sollen -> Kopf -> Schreibtisch ... –
Yiiikes @ _string_ Liste für ein _integer_ Paar! – lpapp