2011-08-27 22 views
5

Şu anda Qt 4.5.x'ten 4.7.3'e geçiş yaptık ve o zamandan beri DBus üzerinde float göndermeye çalışırken ('float' DBus türü olarak kayıtlı değil) hatalar alıyoruz. ÖrneğinQDBus üzerinden gönderme gönderimi

:

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

getSensorValue bir float değeri veren bir yöntemdir.
4.6'dan önceki bir sürümde bir QVariant yalnızca bir double değeri içerebileceğinden, döndürme değerleri örtülü olarak bir double ve bir double DBus boyunca gönderilebilir. Ancak, sürüm 4,6'dan beri, bir QVariant bir float; Sonuç olarak, DBus modülü floats'un bilinen bir veri türü olmadığından şikayet eder - ki bu doğrudur.

Ben float veri türünü kayıt ve gerçek zamanlı aktarım operatörleri uygulamaya çalışmıştır:

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 
} 

Ama QDBusArgument (operator <<) içine double akışı deneyin, bir hata alıyorum olduğunu float veritipi double davranışını geçersiz kılmaya çalışıyor.
Bu da normaldir çünkü altta yatan QDbus sistemi zaten veri tipini ('f') QDBusArgument akışına aktarmış ve ardından bir double akışa girmekte olduğunu algılar.

Ve şimdi sorum şu: bu float akışını, arka uç yöntemlerinde ile tüm float veri türlerini değiştirmek zorunda kalmadan nasıl aktarabilirim?

cevap

0

(Ben ilk olarak QtDBus'u şikayet etmeyi durdurmak için beginStructure() ve endStructure()'u kullanmanızı önerdiğim bir yanıt oluşturmuştum ama sonra sorununuzu çözmediğini fark ettim: muhtemelen muhtemelen "bir yapıda iki kat daha fazla", ancak sadece bir çift olarak süzülür.)

QDBusArgument'e doğrudan doğruya geçerken, otomatik olarak ikiye bölünür ve sorun olmaz. Ancak bir QVariantList aracılığıyla iletmek istiyorsanız, onu QVariantList'e yerleştirmeden önce başka bir seçeneğiniz yoktur.

Ancak kirli çözümlerle korkmuyoruz eğer sizin için yapalım için QVariantList ekleme operatörünü aşırı edebilirsiniz:

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

Bu benim için kabul edilebilir bir çözümdür. Teşekkürler. –

İlgili konular