c++qttcpqvariant

Convert QPair to QVariant


I have the following problem: I want to transmitt data via TCP, and wrote a function for that. For maximum reusability the function template is f(QPair<QString, QVariant> data). The first value (aka QString) is used by the receiver as target address, the second contains the data. Now I want to transfer a QPair<int, int>-value, but unfortunately I can not convert a QPair to a QVariant. The optimum would be to be able to transfer a pair of int-values without having to write a new function (or to overload the old one). What is the best alternative for QPair in this case?


Solution

  • You have to use the special macro Q_DECLARE_METATYPE() to make custom types available to QVariant system. Please read the doc carefully to understand how it works.

    For QPair though it's quite straightforward:

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