我有以下问题:我想通过TCP传输数据,并编写了一个函数来实现。为了最大限度地提高重用性,函数模板为f(QPair<QString,QVariant> data)
。第一个值(即QString
)由接收器用作目标地址,第二个值包含数据。现在我想传输一个QPair<int,int>
-值,但不幸的是我无法将QPair
转换为QVariant
。最理想的情况是能够传输一对int
值,而无需编写新函数(或重载旧函数)。在这种情况下,最佳的QPair
替代方案是什么?
我有以下问题:我想通过TCP传输数据,并编写了一个函数来实现。为了最大限度地提高重用性,函数模板为f(QPair<QString,QVariant> data)
。第一个值(即QString
)由接收器用作目标地址,第二个值包含数据。现在我想传输一个QPair<int,int>
-值,但不幸的是我无法将QPair
转换为QVariant
。最理想的情况是能够传输一对int
值,而无需编写新函数(或重载旧函数)。在这种情况下,最佳的QPair
替代方案是什么?
Q_DECLARE_METATYPE()
来使自定义类型在QVariant
系统中可用。
请仔细阅读文档以了解其工作原理。#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;
// ...
}
QVariant
的文档中完全错过了value<T>()
,因为我实际上正在使用一对来传递一些QAction
数据。非常感谢您的帖子。+1 - rbaleksandar注意:此答案使用其他函数进行转换,这是您需要考虑的。
您可以使用QDataStream
将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;
}