将QPair转换为QVariant

13

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


1
你可以使用QStringList来代替QPair来存放这两个整数。QStringList可以被转换为QVariant。 - user2672165
好的,那是一个简单的解决方案,我应该自己知道的 -> 摔头 -> 桌子... - arc_lupus
3
哎呀,这个 integer 对的 string 列表看起来有点糟糕! - László Papp
@arc_lupus 有没有可能将这个标记为已解决? - azf
@totem:谢谢你记得我! - arc_lupus
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;

    // ...
}

我在QVariant的文档中完全错过了value<T>(),因为我实际上正在使用一对来传递一些QAction数据。非常感谢您的帖子。+1 - rbaleksandar
根据QMetaType文档,一些类型会自动注册,不需要使用这个宏:http://doc.qt.io/qt-5/qmetatype.html#Type-enum,包括QPair<int,int>。 - Tom

4

注意:此答案使用其他函数进行转换,这是您需要考虑的。

您可以使用QDataStreamQPair序列化为QByteArray,然后将其转换为QVariant,反向过程可获取QPairQVariant中。

示例:

//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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接