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

举报
DS小龙哥 发表于 2022/09/14 13:28:05 2022/09/14
【摘要】 在软件开发中可能有需求修改用户环境变量,添加新的值进行。比如:添加某些可执行文件、某些动态库的路径到系统环境PATH中,能够让可执行文件运行过程中可以找到对应的dll。

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("清空成功!"));
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。