2014-12-13 58 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; 
}