我有以下问题:我想通过 TCP 传输数据,并为此编写了一个函数。为了获得最大的可重用性,函数模板是f(QPair<QString, QVariant> data)
. 第一个值(aka QString
)被接收器用作目标地址,第二个包含数据。现在我想转移一个QPair<int, int>
-value,但不幸的是我无法将 a 转换QPair
为 a QVariant
。最佳方案是能够传输一对 - 值int
而无需编写新函数(或重载旧函数)。QPair
在这种情况下,最好的选择是什么?
问问题
7530 次
2 回答
24
您必须使用特殊宏Q_DECLARE_METATYPE()
来使自定义类型可用于QVariant
系统。
请仔细阅读文档以了解其工作原理。
对于 QPair 虽然它非常简单:
#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;
// ...
}
于 2014-12-13T19:50:29.683 回答
3
注意:这个答案使用另一个函数来转换它们,你可以考虑。
您可以使用QDataStream
将 to 序列化QPair
,QByteArray
然后将其转换为QVariant
,并且您可以通过逆过程QPair
从QVariant
.
例子:
//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;
}
于 2014-12-13T17:56:56.253 回答