2011-08-27 22 views
5

我們目前從Qt的4.5.x遷移到4.7.3,從那以後,我們得到的錯誤嘗試過的DBus(「浮動」未註冊爲的DBus型)發送彩車時。發送浮在QDBus

例如:

QVariantList getTemperatures() 
{ 
    QVariantList retVal; 
    retVal << getSensorValue(1) << getSensorValue(2); 
    return retVal; 
} 

getSensorValue是一個返回float值的方法。
由於4.6版本之前版本中的QVariant只能包含double值,因此返回值隱式轉換爲double,並且可以沿着DBus發送double。 但是,從版本4,6開始,一個QVariant可以包含一個float;因此,DBus模塊抱怨floats不是已知的數據類型 - 這是正確的。

我試圖註冊float數據類型,並實現流媒體運營商:

qDBusRegisterMetaType<float>(); 

QDBusArgument &operator<<(QDBusArgument &argument, const float &myFloat) 
{ 
    return argument << static_cast<double>(myFloat); 
} 

const QDBusArgument &operator>>(const QDBusArgument &argument, float &myFloat) 
{ 
    double d; 
    argument >> d; 
    myFloat = static_cast<float>(d); 
    return argument 
} 

但是,當我嘗試流的doubleQDBusArgumentoperator <<),我得到一個錯誤的float數據類型正試圖覆蓋double行爲。
這也是正常的,因爲底層的QDbus系統已經將數據類型('f')流式傳輸到QDBusArgument,然後檢測到double正在進入流。

現在我的問題:沒有任何人知道我怎麼會流這個float,而不必在後端方法doubles全部更換float數據類型?

回答

0

(我最初創建了一個答案,我建議您使用beginStructure()endStructure()以使QtDBus停止抱怨,但後來我意識到它不能解決您的問題:您可能不希望傳遞浮動作爲一個「在一個結構的雙」,而只是爲double。)

當直接傳遞浮到QDBusArgument它被自動澆鑄成雙並沒有問題。但是如果你想通過一個QVariantList傳遞它,你沒有別的選擇,只能在將它放入QVariantList之前進行轉換。

不過,如果你通過骯髒的解決方案是不是怕你可以重載QVariantList的插入操作,讓它爲你做它:

// g++ -o main main.cpp -lQtCore -lQtDBus 

#include <QtDBus/QDBusArgument> 

QVariantList & operator<<(QVariantList & list, const float & f) 
{ 
    QVariant variant(static_cast<double>(f)); 
    list << variant; 
    return list; 
} 

int main() 
{ 
    QDBusArgument test; 
    QVariantList list; 
    float f = 1.0; 
    list << f; 
    test << list; // doesn't trigger any error 
    return 0; 
} 
+0

這是對我來說是可以接受的解決方案。謝謝。 –