【问题标题】:Saving a class into qsettings [duplicate]将类保存到 qsettings [重复]
【发布时间】:2016-04-26 10:58:55
【问题描述】:

我有一个类是 QObject,它有一个成员是 Unit *。

保存抱怨无法保存单位*

[26.04 12:53:21 W] QVariant::save: unable to save type 'Unit*' (type id: 1362).

我尝试使用qRegisterMetaTypeStreamOperators<Unit*>("Unit*"); 注册它,但是 我收到以下错误

/usr/include/qt/QtCore/qvariant.h:465: error: 'QVariant::QVariant(void*)' is private
     inline QVariant(void *) Q_DECL_EQ_DELETE;
            ^

这是我的加载和保存机制

void Profile::save(QSettings& settings) const {
    for(int i=0; i<metaObject()->propertyCount(); ++i) {
        const auto& p = metaObject()->property(i);
        if(p.isStored(this)) {
            settings.setValue(p.name(), property(p.name()));
        }
    }
}

void Profile::load(QSettings& settings) {
    for(int i=0; i<metaObject()->propertyCount(); ++i) {
        const auto& p = metaObject()->property(i);
        if(p.isStored(this)) {
            setProperty(p.name(), settings.value(p.name()));
        }
    }
}

这是我的单元课

Unit::Unit(int unit, QObject *parent)
    : EraObject(parent),
      m_value(0.0),
      m_unit(unit)
{
    connect(eApp->systemController()->unitManager(),&UnitManager::onUnitChanged,this,&Unit::changeUnit);
}

Unit::Unit(const Unit &other)
{
    m_value = other.m_value;
    m_unit = other.m_unit;
    qRegisterMetaTypeStreamOperators<Unit*>("Unit*");
}

Unit &Unit::operator=(const qreal value)
{
    if (m_value == value)
        return *this;

    m_value = value;
    emit userValueChanged();

    return *this;
}


void Unit::loadFrom(Settings &set, bool ownGroup)
{
    Q_UNUSED(ownGroup)
    if(set.contains(objectName())) {
        m_value = set.value(objectName(),0.0).toDouble();
        emit userValueChanged();
    }
}

void Unit::saveTo(Settings &set, bool ownGroup, bool force)
{
    Q_UNUSED(ownGroup)
    Q_UNUSED(force)
    set.setValue(objectName(),m_value);
}

Unit::operator qreal() const
{
    return m_value;
}

qreal Unit::userValue() const
{
    return isDefault() ?  m_value : UnitManager::convertTo(m_value,m_unit);
}

QString Unit::symbol() const
{
    return UnitManager::symbolName(m_unit);
}

void Unit::setUserValue(const qreal userValue)
{
    qDebug() << "setUserValue" <<  this->userValue() << userValue << QString::number(m_unit,2);
    if (this->userValue() == userValue)
        return;

    if(isDefault())
        m_value = userValue;
    else
        m_value = UnitManager::convertFrom(userValue,m_unit);

    qDebug() << "Value" <<  m_value;

    emit userValueChanged();
    setDirty(RamDirty);
}

void Unit::setup(quint32 unit, const QString name, QObject *parent)
{
    if(!m_unit)
        m_unit = (unit << 16);
    setObjectName(name);
    setParent(parent);
    connectDirtyWithParent(parent);
}

void Unit::changeUnit(const quint32 &unit)
{
    if(m_unit == unit || category() != (unit >> 16))
        return;
    m_unit = unit;
    emit userValueChanged();
    emit symbolChanged();
}

更新:

现在我试着写了

QDataStream& operator<<(QDataStream& out, const Unit& v) {
    out << v.userValue();
    return out;
}

QDataStream& operator>>(QDataStream& in, Unit& v) {
    in >> v.userValue();
    return in;
}

我得到了

/home/ahmed/server/elec/software_t/backup17/checko5/eracommon5/src/cpp/system/unit/unit.cpp:21: error: ambiguous overload for 'operator<<' (operand types are 'QDataStream' and 'qreal {aka double}')
     out << v.userValue();
         ^

UPDATE2

QDataStream &Unit::operator <<(QDataStream &out,  Unit &val)
{
    out << val.userValue();
    return out;
}

QDataStream &Unit::operator >>(QDataStream &out,  Unit &val)
{
    in >> val.userValue();
    return in;
}

更新 3:

Unit::Unit(int unit, QObject *parent)
    : EraObject(parent),
      m_value(0.0),
      m_unit(unit)
{
    connect(eApp->systemController()->unitManager(),&UnitManager::onUnitChanged,this,&Unit::changeUnit);
    qRegisterMetaTypeStreamOperators<Unit>("Unit");

}

Unit::Unit(const Unit &other)
{
    m_value = other.m_value;
    m_unit = other.m_unit;
}


QDataStream &operator<<(QDataStream &out, const Unit &unit)
{
    out << unit.value();
    return out;
}
QDataStream &operator>>(QDataStream &in, Unit &unit)
{
    in >> unit.value();
    return in;
}

【问题讨论】:

  • 您是否要保留指向文件的指针?
  • 我认为这和:stackoverflow.com/questions/18144377/… 差不多
  • @Davidvanrijn 我已经阅读了,但我不知道如何在那里使用这些代码
  • @alediaferia 我应该怎么做才能将指针的值保存在文件中?
  • 当我写 qRegisterMetaTypeStreamOperators("Unit*");它说 /usr/include/qt/QtCore/qvariant.h:465: error: 'QVariant::QVariant(void*)' is private inline QVariant(void *) Q_DECL_EQ_DELETE; ^

标签: c++ qt


【解决方案1】:

这是qRegisterMetaTypeStreamOperators() 的文档。从那里开始修复您的流式运营商,即它应该如下所示:

QDataStream &operator<<(QDataStream &out, const Unit &unit);
QDataStream &operator>>(QDataStream &out, Unit &unit);

否则,你的那部分代码是正确的。

第二个修复是您无法使用QMetaType 注册指针。您需要注册类型本身:

qRegisterMetaTypeStreamOperators<Unit>("Unit");

最后,qRegisterMetaType()qRegisterMetaTypeStreamOperators() 应该只调用一次(你也调用了qRegisterMetaType(),对吗?)。如果您注意到QMetaType::load() 的文档,这些函数应该只被调用一次(例如在int main() 或其他一些初始化代码中。

【讨论】:

  • 是QDataStream &operator>(QDataStream &out, Unit &unit);应该是成员函数还是应该在类中是免费的?
  • 现在我得到 /home/ahmed/server/elec/software_t/backup17/checko5/eracommon5/src/cpp/system/unit/unit.cpp:57: error: no match for 'operator> >'(操作数类型是'QDataStream'和'qreal {aka double}')在>> unit.value(); ^
猜你喜欢
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多