12

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

4

2 回答 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 序列化QPairQByteArray然后将其转换为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;
}
于 2014-12-13T17:56:56.253 回答