Qt软件开发-QSettings管理用户环境变量(修改、输出)

226 阅读4分钟

1. 前言

在软件开发中可能有需求修改用户环境变量,添加新的值进行。比如:添加某些可执行文件、某些动态库的路径到系统环境PATH中,能够让可执行文件运行过程中可以找到对应的dll。

在Qt里可以使用QSettings来实现,QSettings类提供一个独立于平台的应用程序设置,Qt已经封装好,修改、读取用户的环境变量不需要管理员权限,并且修改也是直接针对系统的环境配置进行修改,并非当前进程有效(所以修改要谨慎操作)。

image-20220905112808474

2. QSettings

QSettings可以修改注册表,支持存储自定义数据格式,通常可以保存应用程序设置,保存和恢复应用程序设置。

QSettings的详细功能在Qt帮助页面有详细的介绍,当前这里只是列出QSettings修改用户环境变量的一个使用案例,其他功能不做详细介绍。

下面是来至Qt帮助页面的介绍:

 QSettings类提供持久的独立于平台的应用程序设置。
 用户通常期望应用程序在会话中记住其设置(窗口大小和位置、选项等)。这些信息通常存储在Windows上的系统注册表中,以及macOS和iOS上的属性列表文件中。在Unix系统上,在没有标准的情况下,许多应用程序(包括KDE应用程序)使用INI文本文件。
 QSettings是围绕这些技术的抽象,使能够以可移植的方式保存和恢复应用程序设置。它还支持自定义存储格式。
 QSettings的API基于QVariant,允许以最小的工作量保存大多数基于值的类型,如QString、QRect和QImage。
 如果只需要一个基于非持久内存的结构,请考虑使用QMap<QString,QVariant>。
 基本用法
 创建QSettings对象时,必须传递公司或组织的名称以及应用程序的名称。例如,如果的产品名为Star Runner,而的公司名为MySoft,则可以按照如下方式构造QSettings对象:
 Q设置("MySoft"、"Star Runner");
 QSettings对象可以在堆栈上或堆上创建(即使用new)。构造和销毁QSettings对象非常快。
 如果在应用程序中使用来自多个位置的QSettings,则可能需要使用QCoreApplication::setOrganizationName()和qCoreApp::setApplicationName()指定组织名称和应用程序名称,然后使用默认的QSetting构造函数:
 QCoreApplication::setOrganizationName("MySoft");
 QCoreApplication::setOrganizationDomain("mysoft.com");
 QCoreApplication::setApplicationName("明星跑步者");
 ...
 Q设置设置;
 (这里,我们还指定了组织的Internet域。当设置Internet域时,它将在macOS和iOS上使用,而不是组织名称,因为macOS和iOS应用程序通常使用Internet域来标识自己。如果未设置域,则从组织名称派生假域。有关详细信息,请参阅下面的平台特定说明。)
 QSettings存储设置。每个设置由指定设置名称(键)的QString和存储与键关联的数据的QVariant组成。要编写设置,请使用setValue()。例如:
 设置setValue("编辑器/包装边缘"68);
 如果已经存在具有相同键的设置,则现有值将被新值覆盖。为了提高效率,更改可能不会立即保存到永久存储中。(可以随时调用sync()来提交更改。)
 可以使用value()返回设置的值:
 int margin = settings.value("editor/wrapMargin").toInt();
 ​
 如果没有指定名称的设置,QSettings将返回空QVariant(可以转换为整数0)。可以通过向value()传递第二个参数来指定另一个默认值:
  int margin = settings.value("editor/wrapMargin", 80).toInt();
 ​
 要测试给定键是否存在,请调用contains()。要删除与键关联的设置,请调用remove()。要获取所有键的列表,请调用allKeys()。要删除所有键,请调用clear()。

3. 实现代码Demo

 #include "widget.h"
 #include "ui_widget.h"
 ​
 Widget::Widget(QWidget *parent)
     : QWidget(parent)
     , ui(new Ui::Widget)
 {
     ui->setupUi(this);
 ​
     this->setWindowTitle("用户环境变量管理");
 }
 ​
 ​
 Widget::~Widget()
 {
     delete ui;
 }
 ​
 ​
 //打印系统环境变量
 void Widget::on_pushButton_print_env_val_clicked()
 {
     QString env_name=ui->lineEdit_env_path_name->text();
     if(env_name.isEmpty())return;
 ​
     //参数解释
     //【1】. "HKEY_CURRENT_USER\Environment": 用户环境变量
     //【2】. QSettings::NativeFormat: 使用最适合平台的存储格式存储设置。
     QSettings seting("HKEY_CURRENT_USER\Environment", QSettings::NativeFormat);
 ​
     //打印用户环境变量path的值。
     QString text_val = seting.value(env_name).toString();
     ui->plainTextEdit->setPlainText(text_val);
 }
 ​
 ​
 //设置环境变量的值
 void Widget::on_pushButton_set_env_val_clicked()
 {
     QString env_name=ui->lineEdit_set_env_name->text();
     if(env_name.isEmpty())return;
 ​
     QString env_val=ui->lineEdit_env_add_val->text();
     if(env_val.isEmpty())return;
 ​
     //参数解释
     //【1】. "HKEY_CURRENT_USER\Environment": 用户环境变量
     //【2】. QSettings::NativeFormat: 使用最适合平台的存储格式存储设置。
     QSettings seting("HKEY_CURRENT_USER\Environment", QSettings::NativeFormat);
 ​
     //获取原环境变量的值
     QString text_val = seting.value(env_name).toString();
 ​
     //遵循windows下环境变量里的路径
     env_val = env_val.replace("/", "\");
 ​
     //windows环境变量;作为间隔
     text_val.append(";");
 ​
     //添加用户设置的值
     text_val.append(env_val);
 ​
     //添加新的值
     seting.setValue(env_name,text_val);
 ​
     QMessageBox::about(this,"提示",tr("新值设置成功!"));
 }
 ​
 ​
 //清空环境变量
 void Widget::on_pushButton_clean_env_clicked()
 {
     QString env_name=ui->lineEdit_clean_env_name->text();
     if(env_name.isEmpty())return;
 ​
     //参数解释
     //【1】. "HKEY_CURRENT_USER\Environment": 用户环境变量
     //【2】. QSettings::NativeFormat: 使用最适合平台的存储格式存储设置。
     QSettings seting("HKEY_CURRENT_USER\Environment", QSettings::NativeFormat);
     //清空环境变量
     seting.setValue(env_name,"");
 ​
     QMessageBox::about(this,"提示",tr("清空成功!"));
 }

本文正在参加「金石计划 . 瓜分6万现金大奖」