1. 前言
在軟件開發(fā)中可能有需求修改用戶環(huán)境變量,添加新的值進(jìn)行。比如:添加某些可執(zhí)行文件、某些動(dòng)態(tài)庫(kù)的路徑到系統(tǒng)環(huán)境PATH中,能夠讓可執(zhí)行文件運(yùn)行過程中可以找到對(duì)應(yīng)的dll。
在Qt里可以使用QSettings
來(lái)實(shí)現(xiàn),QSettings類提供一個(gè)獨(dú)立于平臺(tái)的應(yīng)用程序設(shè)置,Qt已經(jīng)封裝好,修改、讀取用戶的環(huán)境變量不需要管理員權(quán)限,并且修改也是直接針對(duì)系統(tǒng)的環(huán)境配置進(jìn)行修改,并非當(dāng)前進(jìn)程有效(所以修改要謹(jǐn)慎操作)。
2. QSettings
QSettings可以修改注冊(cè)表,支持存儲(chǔ)自定義數(shù)據(jù)格式,通常可以保存應(yīng)用程序設(shè)置,保存和恢復(fù)應(yīng)用程序設(shè)置。
QSettings的詳細(xì)功能在Qt幫助頁(yè)面有詳細(xì)的介紹,當(dāng)前這里只是列出QSettings修改用戶環(huán)境變量的一個(gè)使用案例,其他功能不做詳細(xì)介紹。
下面是來(lái)至Qt幫助頁(yè)面的介紹:
QSettings類提供持久的獨(dú)立于平臺(tái)的應(yīng)用程序設(shè)置。
用戶通常期望應(yīng)用程序在會(huì)話中記住其設(shè)置(窗口大小和位置、選項(xiàng)等)。這些信息通常存儲(chǔ)在Windows上的系統(tǒng)注冊(cè)表中,以及macOS和iOS上的屬性列表文件中。在Unix系統(tǒng)上,在沒有標(biāo)準(zhǔn)的情況下,許多應(yīng)用程序(包括KDE應(yīng)用程序)使用INI文本文件。
QSettings是圍繞這些技術(shù)的抽象,使能夠以可移植的方式保存和恢復(fù)應(yīng)用程序設(shè)置。它還支持自定義存儲(chǔ)格式。
QSettings的API基于QVariant,允許以最小的工作量保存大多數(shù)基于值的類型,如QString、QRect和QImage。
如果只需要一個(gè)基于非持久內(nèi)存的結(jié)構(gòu),請(qǐng)考慮使用QMap< QString,QVariant >。
基本用法
創(chuàng)建QSettings對(duì)象時(shí),必須傳遞公司或組織的名稱以及應(yīng)用程序的名稱。例如,如果的產(chǎn)品名為Star Runner,而的公司名為MySoft,則可以按照如下方式構(gòu)造QSettings對(duì)象:
Q設(shè)置("MySoft"、"Star Runner");
QSettings對(duì)象可以在堆棧上或堆上創(chuàng)建(即使用new)。構(gòu)造和銷毀QSettings對(duì)象非常快。
如果在應(yīng)用程序中使用來(lái)自多個(gè)位置的QSettings,則可能需要使用QCoreApplication::setOrganizationName()和qCoreApp::setApplicationName()指定組織名稱和應(yīng)用程序名稱,然后使用默認(rèn)的QSetting構(gòu)造函數(shù):
QCoreApplication::setOrganizationName("MySoft");
QCoreApplication::setOrganizationDomain("mysoft.com");
QCoreApplication::setApplicationName("明星跑步者");
...
Q設(shè)置設(shè)置;
(這里,我們還指定了組織的Internet域。當(dāng)設(shè)置Internet域時(shí),它將在macOS和iOS上使用,而不是組織名稱,因?yàn)閙acOS和iOS應(yīng)用程序通常使用Internet域來(lái)標(biāo)識(shí)自己。如果未設(shè)置域,則從組織名稱派生假域。有關(guān)詳細(xì)信息,請(qǐng)參閱下面的平臺(tái)特定說(shuō)明。)
QSettings存儲(chǔ)設(shè)置。每個(gè)設(shè)置由指定設(shè)置名稱(鍵)的QString和存儲(chǔ)與鍵關(guān)聯(lián)的數(shù)據(jù)的QVariant組成。要編寫設(shè)置,請(qǐng)使用setValue()。例如:
設(shè)置setValue("編輯器/包裝邊緣",68);
如果已經(jīng)存在具有相同鍵的設(shè)置,則現(xiàn)有值將被新值覆蓋。為了提高效率,更改可能不會(huì)立即保存到永久存儲(chǔ)中。(可以隨時(shí)調(diào)用sync()來(lái)提交更改。)
可以使用value()返回設(shè)置的值:
int margin = settings.value("editor/wrapMargin").toInt();
?
如果沒有指定名稱的設(shè)置,QSettings將返回空QVariant(可以轉(zhuǎn)換為整數(shù)0)。可以通過向value()傳遞第二個(gè)參數(shù)來(lái)指定另一個(gè)默認(rèn)值:
int margin = settings.value("editor/wrapMargin", 80).toInt();
?
要測(cè)試給定鍵是否存在,請(qǐng)調(diào)用contains()。要?jiǎng)h除與鍵關(guān)聯(lián)的設(shè)置,請(qǐng)調(diào)用remove()。要獲取所有鍵的列表,請(qǐng)調(diào)用allKeys()。要?jiǎng)h除所有鍵,請(qǐng)調(diào)用clear()。
3. 實(shí)現(xiàn)代碼Demo
#include "widget.h"
#include "ui_widget.h"
?
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui- >setupUi(this);
?
this- >setWindowTitle("用戶環(huán)境變量管理");
}
?
?
Widget::~Widget()
{
delete ui;
}
?
?
//打印系統(tǒng)環(huán)境變量
void Widget::on_pushButton_print_env_val_clicked()
{
QString env_name=ui- >lineEdit_env_path_name- >text();
if(env_name.isEmpty())return;
?
//參數(shù)解釋
//【1】. "HKEY_CURRENT_USEREnvironment": 用戶環(huán)境變量
//【2】. QSettings::NativeFormat: 使用最適合平臺(tái)的存儲(chǔ)格式存儲(chǔ)設(shè)置。
QSettings seting("HKEY_CURRENT_USEREnvironment", QSettings::NativeFormat);
?
//打印用戶環(huán)境變量path的值。
QString text_val = seting.value(env_name).toString();
ui- >plainTextEdit- >setPlainText(text_val);
}
?
?
//設(shè)置環(huán)境變量的值
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;
?
//參數(shù)解釋
//【1】. "HKEY_CURRENT_USEREnvironment": 用戶環(huán)境變量
//【2】. QSettings::NativeFormat: 使用最適合平臺(tái)的存儲(chǔ)格式存儲(chǔ)設(shè)置。
QSettings seting("HKEY_CURRENT_USEREnvironment", QSettings::NativeFormat);
?
//獲取原環(huán)境變量的值
QString text_val = seting.value(env_name).toString();
?
//遵循windows下環(huán)境變量里的路徑
env_val = env_val.replace("/", "");
?
//windows環(huán)境變量;作為間隔
text_val.append(";");
?
//添加用戶設(shè)置的值
text_val.append(env_val);
?
//添加新的值
seting.setValue(env_name,text_val);
?
QMessageBox::about(this,"提示",tr("新值設(shè)置成功!"));
}
?
?
//清空環(huán)境變量
void Widget::on_pushButton_clean_env_clicked()
{
QString env_name=ui- >lineEdit_clean_env_name- >text();
if(env_name.isEmpty())return;
?
//參數(shù)解釋
//【1】. "HKEY_CURRENT_USEREnvironment": 用戶環(huán)境變量
//【2】. QSettings::NativeFormat: 使用最適合平臺(tái)的存儲(chǔ)格式存儲(chǔ)設(shè)置。
QSettings seting("HKEY_CURRENT_USEREnvironment", QSettings::NativeFormat);
//清空環(huán)境變量
seting.setValue(env_name,"");
?
QMessageBox::about(this,"提示",tr("清空成功!"));
}
審核編輯:湯梓紅
-
軟件開發(fā)
+關(guān)注
關(guān)注
0文章
586瀏覽量
27278 -
應(yīng)用程序
+關(guān)注
關(guān)注
37文章
3198瀏覽量
57363 -
Qt
+關(guān)注
關(guān)注
1文章
300瀏覽量
37604 -
變量
+關(guān)注
關(guān)注
0文章
607瀏覽量
28257
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論