在我的桌面应用程序中,我使用QSettings来保存各种应用程序值.例如,主表单位置,最近文档,连接参数以及一些改变应用程序行为方式的内容,例如"在信息对话框中不再显示此消息".
我通常的处理方法是在应用程序启动时将所有设置读入结构或对象,并在应用程序关闭时保存它们.
我还有一个对话框,可以让我编辑设置对象中的许多值,并在关闭对话框时保存它们.
许多窗口和非可视对象都需要设置对象中的值.
做这个的最好方式是什么?
我已经开始将设置对象作为主窗口的成员,但后来我遇到了其他窗口需要访问主窗口成员的问题.
我确实认为我可以在自己的cpp文件中创建设置对象,只需#include需要的地方.但我不确定这是否可能或它的语法.
这种情况的最佳做法是什么?
我建议总是使用QSettings,避免使用补充结构或类.您可以在主体中设置应用程序名称,组织名称和组织管理.
来自QtDocs:
如果在应用程序的许多位置使用QSettings,则可能需要使用QCoreApplication :: setOrganizationName()和QCoreApplication :: setApplicationName()指定组织名称和应用程序名称,然后使用默认的QSettings构造函数:
QCoreApplication::setOrganizationName("MySoft");
QCoreApplication::setOrganizationDomain("mysoft.com");
QCoreApplication::setApplicationName("Star Runner");
Run Code Online (Sandbox Code Playgroud)
然后使用默认构造函数,您需要在其中加入属性:
QSettings settings;
Run Code Online (Sandbox Code Playgroud)
QSettings对象可以在堆栈上或堆上创建(即使用new).构造和销毁QSettings对象非常快.
您可以在程序中的任何位置设置设置:
如果已存在具有相同键的设置,则新值将覆盖现有值.为了提高效率,可能无法立即将更改保存到永久存储中.(您始终可以调用sync()来提交更改.)
您也可以在不同的线程中使用它而不会出现问题:
QSettings是可重入的.这意味着您可以同时在不同的线程中使用不同的QSettings对象.即使QSettings对象引用磁盘上的相同文件(或系统注册表中的相同条目),此保证仍然有效.如果通过一个QSettings对象修改了设置,则更改将立即在任何其他QSettings对象中可见,这些对象在同一位置上运行并且位于同一进程中.
QSettings可以安全地用于不同的进程(可以是同时运行的应用程序的不同实例或完全不同的应用程序)来读取和写入相同的系统位置.它使用建议文件锁定和智能合并算法来确保数据完整性.请注意,sync()会导入其他进程所做的更改(除了从此QSettings写入更改).
小智 6
QSettings不是线程安全的.文件明确说明:
QSettings是可重入的.这意味着您可以同时在不同的线程中使用不同的QSettings对象.即使QSettings对象引用磁盘上的相同文件(或系统注册表中的相同条目),此保证仍然有效.
它是可重入的但不是线程安全的.您无法安全地从多个线程使用全局QSettings对象.如果一个线程调用beginGroup()然后第二个线程也调用beginGroup(),那么你就会遇到问题,因为你的QSettings对象有错误的前缀.
为同一文件使用多个QSettings对象是线程安全的.因此,您应该在堆栈本地创建QSettings对象,而不是全局共享单个对象以避免竞争条件.