将类保存到 qsettings [重复]

2024-04-04

我有一个 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();
}

UPDATE:

现在我试着写

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;
}

这是文档qRegisterMetaTypeStreamOperators() http://doc.qt.io/qt-5/qmetatype.html#qRegisterMetaTypeStreamOperators。从这里开始修复您的流媒体运算符,即它应该如下所示:

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

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

第二个修复是您无法注册指针QMetaType http://doc.qt.io/qt-5/qmetatype.html。您需要注册类型本身:

qRegisterMetaTypeStreamOperators<Unit>("Unit");

Lastly, qRegisterMetaType() and qRegisterMetaTypeStreamOperators()应该只调用一次(您已经调用过qRegisterMetaType()也是如此,对吧?)。如果您注意到文档QMetaType::load() http://doc.qt.io/qt-5/qmetatype.html#load,这些函数应该只被调用一次(例如在int main()或一些其他初始化代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将类保存到 qsettings [重复] 的相关文章

  • C#中如何检测字符串是否为货币

    通常当我需要转换时currency string 如 1200 55 z 或 1 249 到十进制值我这样做 if currencyString Contains z decimal value Decimal Parse dataToCh
  • 我可以使用反射更改 C# 中的私有只读字段吗?

    我想知道 由于很多事情都可以使用反射完成 我可以在构造函数完成执行后更改私有只读字段吗 注 只是好奇 public class Foo private readonly int bar public Foo int num bar num
  • 高级 Win32 图像文件 I/O?

    我想在 Windows C 应用程序中将图像文件读入内存 什么是一个相当简单的解决方案 也许类似于 IOS 提供的UIImage 我希望支持合理数量的文件格式 我需要为图像处理的位图提供一些低级访问权限 我在互联网上阅读了很多内容 看起来
  • 将 2D 数组映射到 1D 数组

    我想用一维数组来表示一个二维数组 函数将传递两个索引 x y 和要存储的值 这两个索引代表一维数组的单个元素 并相应地设置它 我知道一维数组需要具有 arrayWidth arrayHeight 的大小 但我不知道如何设置每个元素 例如 如
  • 处理 LINQ sum 表达式中的 null

    我正在使用 LINQ 查询来查找列的总和 并且在少数情况下该值有可能为空 我现在使用的查询是 int score dbContext domainmaps Where p gt p SchoolId schoolid Sum v gt v
  • .NET 可移植类库中的 .ToShortDateString 发生了什么

    我想知道为什么没有 ToShortDateString在 NET 可移植类库中 我有 2 个项目 Silverlight 和常规 NET 类库 使用相同的代码 并且代码涉及调用 ToShortDateString on a DateTime
  • __FUNCTION__ 宏的 C# 版本

    有人对 C FUNCTION 宏的 C 版本有好的解决方案吗 编译器似乎不喜欢它 尝试使用这个代替 System Reflection MethodBase GetCurrentMethod Name C 没有 LINE or FUNCTI
  • 阅读 Stack Overflow RSS 源

    我正在尝试获取未回答问题的列表the feed https stackoverflow com feeds 但我在阅读时遇到困难 const string RECENT QUESTIONS https stackoverflow com f
  • 为什么以下代码不允许我使用 fgets 获取用户输入但可以使用 scanf?

    这是一个更大程序的简短摘录 但该程序的其余部分无关紧要 因为我认为我能够隔离该问题 我怀疑这与我使用 fgets 的方式有关 我读过 最好使用 fgets 而不是 scanf 但我似乎无法让它在这里正常工作 当我使用以下代码时 程序不会给我
  • 使用 Linq 进行异步Where过滤

    我有一个List通过填充的元素async调用 WebService 没问题 我需要过滤该列表以便在应用程序视图上显示某些内容 我试过这个 List
  • 标准 C 中的 sizeof 与 sizeof()? [复制]

    这个问题在这里已经有答案了 我看到一些直接使用 sizeof 的代码 想知道它是否是标准 C 令我惊讶的是 它运行得很好 这是一个例子 include
  • 使用 AutoMapper 进行 LINQ GroupBy 聚合

    试图让查询工作 但老实说不确定如何 或者是否可能 进行它 因为我尝试过的一切都不起作用 共查询6个表 Person PersonVote PersonCategory Category City FirstAdminDivision Per
  • 如何使用 Clang 查找内存泄漏

    我在我的机器 ubuntu 中安装了 Clang 以便发现我的 C 代码中的内存泄漏 我编写了一个示例代码来检查它的工作情况 如下所示 File hello c for leak detection include
  • 通过 MSBuild 调用 cl.exe 时无限期挂起

    我正在尝试在我的 主要是 C 项目上运行 MSBuild 想象一下一个非常庞大的代码库 Visual Studio 2015 是有问题的工具集 Windows 7 SP1 和 VS 2015 更新 2 即使使用 m 1 从而迫使它仅使用一个
  • 便携式终端

    有没有办法根据所使用的操作系统自动使用正确的 EOL 字符 我在想类似的事情std eol 我知道使用预处理器指令非常容易 但很好奇它是否已经可用 我感兴趣的是 我的应用程序中通常有一些消息 稍后我会将这些消息组合成一个字符串 并且我希望将
  • 为什么我不能在扩展 List 的类中调用 OrderBy?

    我有一堂课 Deck 其中包含一个名为的方法Shuffle 我正在致力于重构Deck延长List
  • 局部静态变量初始化是线程安全的[重复]

    这个问题在这里已经有答案了 假设我有一个包含三个静态函数的类 如下所示 include
  • 从 C# 中的 .NET SecureString 读取单个字符?

    WPF 的PasswordBox 返回一个SecureString 它对窥探者隐藏密码 问题是你最终必须获得密码的值 而我在网上找到的建议都涉及将值复制到字符串中 这会让你回到窥探者的问题 IntPtr bstr Marshal Secur
  • 如何仅更改 DateTime 的日期部分,同时保留时间部分?

    我在代码中使用了很多 DateTime 我想将这些日期时间更改为我的特定日期并保留 时间 1 2012 02 02 06 00 00 gt 2015 12 12 06 00 00 2 2013 02 02 12 00 00 gt 2015
  • 在 C# 中读取/写入命令行程序

    我正在尝试与 C 的命令行程序进行对话 它是一个情绪分析器 它的工作原理如下 CMD gt java jar analyser jar gt Starting analyser 这是我想从我的 C 程序插入内容的地方 例如 I love y

随机推荐

  • 动态 Jquery 拆分器插件

    我正在尝试使用 Jquery Splitterhttp www methvin com jquery splitter http www methvin com jquery splitter 如果分隔窗格是静态的 它工作得很好 但我需要在
  • 两个视图 - 一个 ViewModel

    我一定是误解了这个概念ViewModels和意见 但目前我无法从地面重建应用程序 这次做得更好 我的情况是 我有一个视图 用户可以在其中加载文件并读取它们 绘图仪显示图形并实现一些操作 我希望能够生成数据报告 如摘要 但我希望它在其他视图中
  • 如何仅使用 HTML 和 CSS(或者我猜是 java)创建滚动文本的动画,就像苹果过去在其实时页面上使用的那样?

    我的网站顶部有一个蓝色横幅 左侧有浅色径向渐变 我想要在横幅右侧向上滚动的白色文本动画 我希望它在出现时淡入 然后淡出 我希望不使用 Flash 并尽可能少地使用 Java 来完成此操作 我可以通过 CSS 进行工作并设置布局 但我不知道如
  • C# 中的实时麦克风幅度测量

    我正在寻找简单的解决方案 它将返回 C 中麦克风输入的整数值 我已经在网上检查了可用的示例 但它们都不能在 x64 环境中工作 VS2008 W7 x64 是否有任何简单的解决方案可以返回 C 中麦克风输入的幅度 或频率 值 我尝试了 NA
  • Julia ccall 接口和符号的问题

    我正在尝试使用朱莉娅的ccall与 C 库接口的函数 所有类型和指针都是正确的 并且下面的函数调用成功返回正确的答案 为简洁起见 此处未显示变量定义和设置 ccall vDSP convD libacc Void Ptr T Int64 P
  • jquery("foo bar") 与 jquery("foo").find("bar")

    我正在尝试遍历 xml 文档 这不起作用 零结果 jquery foo bar 这确实有效 jquery foo find bar 知道为什么吗 jquery foo bar 第一个查找 bar 元素是 foo 元素的后代 所以在这个例子中
  • 套接字编程最佳实践?

    我正在设计一个文件同步应用程序 如 DropBox 客户端在端口 443 上与服务器保持持久的安全 SSL TCP 套接字 每当在客户端上创建 更改 删除文件时 包含相关数据的数据包就会通过套接字发送到服务器 服务器对其进行处理更新服务器上
  • #include<> 和 #define"" 之间有什么区别[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 有人能告诉我 include 和 define 之间的区别吗 我知道 include 用于包含头文件 define 用于定义宏或常量 是不是
  • 在 Spring Security 中以编程方式自定义 WebAuthenticationDetails

    我目前正在从基于 xml 的 spring security 配置转向基于 java 的配置 我需要通过 Java 设置自定义 WebAuthenticationDetails 有没有办法做到这一点 在 XML 中 我只需设置 Userna
  • Qt 5.7 将 -std=gnu++11 添加到我的编译器标志中,破坏 -std=c++14

    我在我的中设置以下标志CMakeLists txt set CMAKE CXX FLAGS std c 14 g O0 然后我正在使用find package定位Qt5Test find package Qt5Test REQUIRED 然
  • tf.image.resize_bilinear 与 cv2.resize

    结果来自tf image resize bilinear与cv2 resize 我觉得这有点麻烦 放align corners True并不总是合理的 因为四个角并不总是应该固定在角上 那么有没有办法让它变得更加 对称 呢 重现代码 imp
  • jQuery Mobile -> 覆盖 jQuery UI Datepicker -> 布局损坏

    我在我的 Web 应用程序中使用 jQuery Mobile 有一个日期选择器会覆盖默认的 jQuery UI 日期选择器 这是来源 https github com jquery jquery mobile tree master exp
  • Android 应用程序更新的 Delta 更新

    我正在尝试设置自己的服务器来托管 apk 文件 这些文件可用于客户端应用程序中的安装和更新 当apk有新版本更新时 客户端只需要下载更新的部分 我可以在服务器端使用 bsdiff 生成补丁文件 但是在客户端 我应该如何将补丁文件与原始apk
  • 保持自托管服务堆栈服务作为 docker swarm 服务打开,而不使用控制台 readline 或 readkey

    我有一个使用 servicestack 用 C 编写的控制台应用程序 其形式如下 static void Main string args Some service setup code here Console ReadKey 这段代码在
  • 如何在 IOS 5 中包含 SSZipArchive?

    对于我正在从事的项目 我需要解压缩某些文件 为此 我找到了图书馆SSZip存档 https github com samsoffes ssziparchive 我将其包含在 Xcode 4 2 中 右键单击 类 文件夹 gt 将文件添加到项
  • 使用 std::greater 或 std::less 作为参数的参数

    我想创建一个带有接受以下任一参数的函数std greater
  • Python pickling 保持对象身份

    有什么方法可以保留腌制对象的身份 即具有以下打印内容True import pickle class Foo pass x Foo print x is pickle loads pickle dumps x False 我在 Linux
  • 如何从数据属性中获取数据键名称?

    我想从我的 html 元素中获取键名 示例代码 td 220 td 使用 jquery 数据方法我可以键值 但我想提取键名称 var keyValue td data code 123 var keyName 您可以通过以下方式访问所有数据
  • 将披露按钮添加到 MKPointAnnotation

    为了在 Storyboard iOS 项目中创建地图注释 我使用了 CLLocationCoordinate2D annotationCoord3 annotationCoord3 latitude 34 233129 annotation
  • 将类保存到 qsettings [重复]

    这个问题在这里已经有答案了 我有一个 QObject 类 它有一个 Unit 成员 保存抱怨无法保存单位 26 04 12 53 21 W QVariant save unable to save type Unit type id 136