2014-04-03 14 views
5

Tôi gặp vấn đề với các lớp enum, QVariants và lớp QSettings. Có các giá trị lớp enum mà tôi muốn lưu trữ trong một QVariant mà đi vào một cá thể QSettings. Vì vậy, mã của tôi thực sự trông giống như sau:lớp enum trong QVariant trong QSettings

enum class Foo 
{ 
    Bar1, Bar2 
} 
Q_ENUMS(Foo) 
Q_DECLARE_METATYPE(Foo) 

... 

Foo value = Bar2; 
QSettings settings; 
settings.setValue(QString("Foo"), QVariant::fromValue(value)); 

Tại thời điểm này trong việc thực hiện các mã, một sự khẳng định nhảy vào và phàn nàn:

ASSERT failure in QVariant::save: "Invalid type to save", file kernel\qvariant.cpp 

Tìm kiếm trên internet, tôi phát hiện ra rằng lớp là thiếu phụ kiện < < và >> toán tử. Nhưng đó không phải là một lựa chọn cho các lớp enum. Tôi thậm chí đã cố gắng sử dụng

qRegisterMetaType<Foo>("Foo"); 

nhưng không hiệu quả. Có lẽ bạn có một số gợi ý/giải pháp khác cho tôi. Cảm ơn!

Trả lời

3

Enums, đó là ints unsigned đeo mặt nạ, dường như là một vấn đề, xem

Qt4 QSettings save enumeration value (for example Qt::CheckState)

Các giải pháp có và có lẽ đây sẽ là để chuyển đổi nó một unsigned. Để kiểm tra xem kết quả static_cast quay lại enum có hợp lệ không, bạn có thể thêm các giá trị Foo_lowestFoo_highest vào đầu và cuối của phạm vi enum.

+0

Bạn nói đúng, đây là vấn đề với enums trong QVariants. Triển khai ban đầu của tôi đã lưu các giá trị số nguyên thực (không dấu) trong QVariant. Bây giờ tôi đã thử enums scoped, nhưng tôi chạy vào vấn đề này với QVariants. Tuy nhiên, tôi đã chuyển về triển khai ban đầu với mẹo của bạn có giá trị thấp nhất/cao nhất trong enum. Cảm ơn. – CppChris

Các vấn đề liên quan