2011-08-27 11 views
5

Hiện tại chúng tôi đã di chuyển từ Qt 4.5.x sang 4.7.3 và kể từ đó chúng tôi gặp lỗi khi cố gắng gửi nổi trên DBus ('float' không được đăng ký dưới dạng DBus type).Gửi nổi trên QDBus

Ví dụ:

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

getSensorValue là một phương thức trả về một giá trị float.
Vì phiên bản QVariant trong phiên bản trước phiên bản 4.6 chỉ có thể chứa giá trị double, giá trị trả lại được chuyển hoàn toàn đến double và có thể gửi double cùng với DBus. Nhưng, kể từ phiên bản 4.6, QVariant có thể chứa float; kết quả là, mô-đun DBus phàn nàn rằng floats không phải là một kiểu dữ liệu đã biết - đó là chính xác.

Tôi cố gắng để đăng ký float datatype, và để thực hiện các nhà khai thác trực tiếp:

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 
} 

Tuy nhiên, khi tôi cố gắng để dòng double vào QDBusArgument (operator <<), tôi nhận được một lỗi rằng float datatype đang cố gắng ghi đè hành vi double.
Điều này cũng bình thường, bởi vì hệ thống QDbus cơ bản đã phát trực tuyến kiểu dữ liệu ('f') đến QDBusArgument và sau đó phát hiện rằng double đang nhập luồng.

Và bây giờ câu hỏi của tôi: Có ai biết làm thế nào tôi có thể dòng này float, mà không cần phải thay thế tất cả float kiểu dữ liệu với doubles trong các phương pháp phụ trợ?

Trả lời

0

(Trước tiên tôi đã tạo câu trả lời nơi tôi đề nghị bạn sử dụng beginStructure()endStructure() để làm cho QtDBus ngừng phàn nàn nhưng sau đó tôi nhận ra rằng nó không giải quyết được vấn đề của bạn: có thể bạn không muốn truyền float như là một "đôi trong một cấu trúc" nhưng chỉ đơn giản là một đôi.)

Khi truyền trực tiếp phao đến QDBusArgument nó được đúc tự động thành một đôi và không có vấn đề gì. Nhưng nếu bạn muốn vượt qua nó thông qua một QVariantList bạn không có lựa chọn nào khác ngoài việc đúc nó trước khi đưa nó vào trong QVariantList.

Tuy nhiên nếu bạn không sợ bởi giải pháp bẩn, bạn có thể nạp chồng toán tử chèn của QVariantList để cho nó làm điều đó cho bạn:

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

Đây là một giải pháp có thể chấp nhận đối với tôi. Cảm ơn. –