将QPair转换为QVariant

时间:2014-12-13 17:21:34

标签: c++ qt tcp qvariant

我有以下问题:我想通过TCP传输数据,并为此编写了一个函数。为了获得最大的可重用性,函数模板为f(QPair<QString, QVariant> data)。第一个值(aka QString)被接收器用作目标地址,第二个值包含数据。现在我想转移QPair<int, int> - 值,但遗憾的是我无法将QPair转换为QVariant。最佳的方法是能够传输一对int - 值而无需编写新函数(或重载旧函数)。在这种情况下,QPair的最佳替代方案是什么?

2 个答案:

答案 0 :(得分:17)

您必须使用特殊宏Q_DECLARE_METATYPE()QVariant系统提供自定义类型。 Please read the doc carefully了解其运作方式。

对于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;

    // ...
}

答案 1 :(得分:3)

注意:此答案使用其他功能进行转换,您可以考虑使用。

您可以使用QDataStreamQPair序列化为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;
}