Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 为什么我能';是否将QVariantMap存储在QSettings中?_Qt_Qt5_Qmap_Qvariant_Qsettings - Fatal编程技术网

Qt 为什么我能';是否将QVariantMap存储在QSettings中?

Qt 为什么我能';是否将QVariantMap存储在QSettings中?,qt,qt5,qmap,qvariant,qsettings,Qt,Qt5,Qmap,Qvariant,Qsettings,为什么要使用它并以以下格式存储数据: key=@Variant(\0\0\0\b\0\0\0) 但是现在Qt5.11有问题吗?!以下代码 QVariantMap projectsMap; for (auto project : projects) projectsMap.insert(key, value); settings->setValue("Group/projects", projectsMap); 正确执行,但不会将任何内容存储到ini文件 qRegisterMe

为什么要使用它并以以下格式存储数据:

key=@Variant(\0\0\0\b\0\0\0)
但是现在Qt5.11有问题吗?!以下代码

QVariantMap projectsMap;
for (auto project : projects)
    projectsMap.insert(key, value);

settings->setValue("Group/projects", projectsMap);
正确执行,但不会将任何内容存储到ini文件

qRegisterMetaTypeStreamOperators(“QVariantMap”)


也没有帮助。如何存储,这里有什么问题?

不要存储
QSettings
:它不是用来存储的。每次更改设置时,应使用新的
QSettings
实例。析构函数应如下所示:

MyClass::~MyClass() {
  QSettings s;
  s.setValue(kFoo, this->m_bar);
  …
}

QSettings
是设置系统的短暂句柄,它的实例化很便宜。泄漏它是因为
QPointer
不会破坏任何东西:它不是一个拥有指针

不要存储
QSettings
:它不是用来存储设置的。每次更改设置时,应使用新的
QSettings
实例。析构函数应如下所示:

MyClass::~MyClass() {
  QSettings s;
  s.setValue(kFoo, this->m_bar);
  …
}


QSettings
是设置系统的短暂句柄,它的实例化很便宜。泄漏它是因为
QPointer
不会破坏任何东西:它不是一个拥有指针

无法复制(Linux+Qt5.11.2)<代码>项目映射肯定不是空的?
QVariant
实例中包含的类型是否都已在
Qt
元类型系统中注册?@G.M.,是,不为空:使用
qDebug()检查此项。
包含键和值的QString。问题甚至是
“projects”
键不是在ini文件的
“Group”
中创建的。@G.M.,问题是
设置->同步()
:上面的设置存储操作是在析构函数中执行的,我认为设置析构函数应该自动调用
同步()
-似乎不是这样,所以调用
同步()
立即显式-工作正常!谢谢在提供完整的测试用例之前,这个问题是有缺陷的。在什么“析构函数”中设置设置?析构函数在这里一点也不特殊,
QSettings
也不重要。@KubaOber,在我的类设置中声明为
QPointer设置并在销毁对象时显示,未调用
设置->同步()
。显式调用它。无法复制(Linux+Qt5.11.2)<代码>项目映射肯定不是空的?
QVariant
实例中包含的类型是否都已在
Qt
元类型系统中注册?@G.M.,是,不为空:使用
qDebug()检查此项。
包含键和值的QString。问题甚至是
“projects”
键不是在ini文件的
“Group”
中创建的。@G.M.,问题是
设置->同步()
:上面的设置存储操作是在析构函数中执行的,我认为设置析构函数应该自动调用
同步()
-似乎不是这样,所以调用
同步()
立即显式-工作正常!谢谢在提供完整的测试用例之前,这个问题是有缺陷的。在什么“析构函数”中设置设置?析构函数在这里一点也不特殊,
QSettings
也不重要。@KubaOber,在我的类设置中声明为
QPointer设置并在销毁对象时显示,未调用
设置->同步()
。我明白了,错过了关于
QPointer
的信息,现在我明白了为什么人们在Qt应用程序中使用
std::unique_ptr
,因为
QPointer
不是类似的。将更改为
std::unique_ptr
以自动清理对象。您的方式不适用于我,因为设置对象由manager类拥有,并在许多受控类之间共享。只需正确清除设置对象-将使用
std::unique\ptr
进行此设置或仅使用
QSettings设置
作为唯一\u ptr不如
QPointer
那么方便。我告诉您,您不应该对设置对象执行此操作!不要“管理它”!你在为自己创造工作,你甚至不应该尝试。每次你想使用它时都要实例化它。它被设计成这样使用。而不是使用指针,你应该按值存储东西。指针的用途是什么?没有。仅使用对象的生存期与“管理器”的生存期不同的指针。在现代C++中,大多数这样的“管理器”应该是一个简单的结构,其中有值,其中一些可能被封装在<代码>可选< /COD>中。受控对象对设置一无所知,不保存它们,通过管理器()访问->设置()->这就是为什么我需要指针:在管理器和受控对象之间共享单个设置实例。受控对象应该在需要时创建
QSettings
的实例。如果
setting()
返回的不是指向
QSettings
的指针,即您自己的类,则该类应根据需要临时创建设置对象。事实上,您可以将
QSettings
包装到您自己的
Settings
类中,以便其他对象可以使用;例如,这个类将通过getter/setter间接公开设置。这个答案导致我浪费一些时间试图不使用
QSettings*
。那么,如果这不是它的预期用途呢?QThread也不是为了让它的线程工作代码在run()中而设计的;但现在这是一种受支持的用法<代码>QSettings*pSettings对我来说很好。我讨厌每次都设置所有参数。如果你
new
it,并给它传递一个父参数,它会自动处理任何需要释放的内存。我明白了,错过了关于
QPointer
的信息,现在我明白了为什么人们在Qt应用程序中使用
std::unique_ptr
,因为
QPointer
不是模拟的。将更改为
std::unique_ptr
以自动清理对象。你的方式不会改变