【问题标题】:enum class in QVariant in QSettingsQSettings 中 QVariant 中的枚举类
【发布时间】:2014-05-15 11:02:54
【问题描述】:

我对枚举类、QVariants 和 QSettings 类有疑问。我想将枚举类值存储在 QVariant 中,该 QVariant 进入 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));

在执行代码的这一点上,一个断言跳进来并抱怨:

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

搜索互联网,我发现该类缺少合适的 > 运算符。但这不是枚举类的选择。我什至尝试使用

qRegisterMetaType<Foo>("Foo");

但它没有帮助。也许您对我有其他建议/解决方案。谢谢!

【问题讨论】:

    标签: c++11 qt5 qvariant qsettings enum-class


    【解决方案1】:

    被屏蔽的无符号整数的枚举似乎是一个问题,请参阅

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

    那里和可能在这里的解决方案是将其转换为无符号。要检查返回枚举的 static_cast-result 是否有效,您可以在枚举范围的开头和结尾添加 Foo_lowestFoo_highest 值。

    【讨论】:

    • 你说得对,这是 QVariants 中枚举的问题。我最初的实现是将实际(无符号)整数值保存在 QVariant 中。现在我尝试了作用域枚举,但我遇到了 QVariants 的这个问题。但是,我使用枚举中最低/最高值的技巧切换回原始实现。谢谢。
    【解决方案2】:

    你可以从 Qt 5.5 开始使用Q_ENUM 而不必担心调用qRegisterMetaType()

    enum class Foo
    {
        Bar1, Bar2
    }
    Q_ENUM(Foo)
    
    ...
    
    Foo value = Foo::Bar2;
    QSettings settings;
    settings.setValue(QString("Foo"), QVariant::fromValue(value));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多