QDBus

2011-08-27 3 views
5

पर फ़्लोट भेजना हम वर्तमान में Qt 4.5.x से 4.7.3 पर माइग्रेट हुए हैं, और तब से हमें डीबीस ('फ्लोट' डीबीस प्रकार के रूप में पंजीकृत नहीं) पर फ़्लोट भेजने की कोशिश करते समय त्रुटियां मिलती हैं।QDBus

उदाहरण के लिए:

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

getSensorValue एक विधि है कि एक float मान देता है।
चूंकि 4.6 से पहले संस्करण में एक QVariant में केवल double मान हो सकता है, तो वापसी मानों को तत्काल double पर डाला गया था, और double डीबीस के साथ भेजा जा सकता है। लेकिन, संस्करण 4,6 के बाद, एक QVariant में float हो सकता है; नतीजतन, डीबीस मॉड्यूल शिकायत करता है कि 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 
} 

लेकिन, जब मैं QDBusArgument (operator <<) में double स्ट्रीम करने के लिए प्रयास करते हैं, मैं कोई त्रुटि मिलती है कि float डेटाप्रकार double व्यवहार को ओवरराइड करने का प्रयास कर रहा है।
यह भी सामान्य है, क्योंकि अंतर्निहित QDbus प्रणाली ने पहले से ही डेटाटाइप ('f') को QDBusArgument पर स्ट्रीम किया है, और उसके बाद यह पता चलता है कि double स्ट्रीम में प्रवेश कर रहा है।

और अब मेरे सवाल: किसी को भी पता है कि कैसे मैं बैकएंड तरीकों में doubles के साथ सभी float डेटाटाइप्स को बदलने के लिए बिना इस float स्ट्रीम सकता है,?

उत्तर

0

(मैं पहली बार एक जवाब है, जहां मैं आप क्रम में beginStructure() और endStructure() उपयोग करने के लिए QtDBus शिकायत करना बंद करो बनाने के लिए सुझाव दिया है, लेकिन फिर मुझे एहसास हुआ कि यह आपकी समस्या का समाधान नहीं करता है पर बनाया था: आप शायद पारित करने के लिए नहीं करना चाहते हैं अपने एक "संरचना में दोगुनी" के रूप में तैरते हैं, लेकिन बस एक डबल के रूप में।)

सीधे 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

यह मेरे लिए एक स्वीकार्य समाधान है। धन्यवाद। –