2014-12-13 130 views
5

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

+1

你可以使用QStringList中,而不是QPair举办两个整数。 QStringList可以转换为QVariant。 – user2672165 2014-12-13 17:26:39

+0

好的,这是一个简单的解决方案,我应该知道,对于我自己 - > head - > desk ... – 2014-12-13 17:28:32

+2

Yiiikes @ _string_ list for a _integer_ pair! – lpapp 2014-12-14 06:53:08

回答

12

您必须使用特殊的宏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; 

    // ... 
} 
+0

我完全错过了'QVariant'的文档中的'value ()',因为我实际上是使用一对来传递一些'QAction'数据。您的文章非常感谢。 +1 – rbaleksandar 2016-03-14 20:31:01

2

注意:这个答案使用其他函数来转换它们,你可能会考虑。

你可以使用QDataStream序列化QPairQByteArray,然后将其转换为QVariant,并且可以逆过程从QVariant得到QPair

例子:

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