簡體   English   中英

Qt:從應用程序/可執行目錄獲取設置ini文件的問題

[英]Qt: Issue getting the settings ini file from application/executable directory

我在Windows7上使用Qt5.7。
在當前應用中,我有自己的設置管理器類,如下所示:

標頭:

class SettingsManager
{
public:
    void     write(const QString & key, const QVariant & variant);
    QVariant read (const QString & key) const;

private:
    static QSettings settings;
};

來源cpp:

QSettings SettingsManager::settings("settings.ini", QSettings::IniFormat);

void SettingsManager::write(const QString & key, const QVariant & variant)
{
    settings.setValue(key, variant);
}

QVariant SettingsManager::read(const QString & key) const
{
    return settings.value(key);
}

我的問題是:我將該應用程序提供給了一些朋友,可能他們用不同的工作目錄或其他內容啟動了該應用程序,但該應用程序未找到settings.ini文件,因此無法正常運行...

因此,問題是:如何修改上面的代碼,以便能夠從application / executable目錄獲取settings.ini文件? 顯然, settings.ini文件始終與應用程序本身位於同一文件夾中。

看到具有所有非靜態成員函數和所有靜態數據成員的對象似乎有點奇怪。 您是否使用它像SettingsManager()::read(...) 僅在名稱空間或單例模式中使用函數可能更合適。

無論如何,回到問題,您可以為此使用QApplication :: applicationDirPath() 它獲取包含應用程序二進制文件的目錄的絕對路徑。 例如

QString absPath = QDir(QApplication::applicationDirPath()).filePath("settings.ini");    

獲取到所需位置的絕對路徑。

編輯:-對有關“ QApplication不存在錯誤”的評論的響應

似乎您對此有疑問,因為您正在全局靜態初始化器中使用它,該初始化器在輸入main()之前運行,所以還沒有QApplication。 您可以使用靜態函數變量來延遲初始化,直到調用該函數為止。

您可以選擇制作一個Singleton SettingsManager,也可以只選擇QSettings(我認為QSettings可能像我上面所說的那樣怪異)。

QSettings單例的示例:(需要在cpp中定義)

QSettings& globalInstance() {
    static QSettings settings(QDir(QApplication::applicationDirPath()).filePath("settings.ini"));
    return settings;
}

如果在函數中使用該函數,則在調用該函數之前,它不會創建QSettings,屆時將有一個QApplication實例。 但是我更願意讓全班學生單身:

settingsmanager.h

#include <QApplication>
#include <QDir>
#include <QSettings>

class SettingsManager
{
public:
    SettingsManager & instance();

    void     write(const QString & key, const QVariant & variant);
    QVariant read (const QString & key) const;

private:
    SettingsManager(const QString & path) : 
        settings(path, QSettings::IniFormat)
    {}

    QSettings settings;
};

settingsmanager.cpp

#include "settingsmanager.h"

SettingsManager& SettingsManager::instance() {
    static SettingsManager s(QDir(QApplication::applicationDirPath()).filePath("settings.ini"));
    return s;
}

void SettingsManager::write(const QString & key, const QVariant & variant)
{
    settings.setValue(key, variant);
}

QVariant SettingsManager::read(const QString & key) const
{
    return settings.value(key);
}

用法:

auto val = SettingsManager::instance().read("key");

您可以使用QSettings::setPath設置設置路徑

所以

QSettings::setPath(QSettings::IniFormat,QSettings::SystemScope,
                  QCoreApplication::applicationDirPath());

應該做到的。

因為您只有一個ini文件,但似乎不是每個用戶基礎,我認為SystemScope在這里很合適

注意:這將設置此位置Qt在SystemScope查找程序中所有 ini文件的SystemScope因此,如果您想為SystemScope多個ini文件位置,請不要使用此位置

您不應該隨應用程序發送ini文件。 當用戶首次啟動該應用程序時,該應用程序將創建ini文件。 閱讀設置時,應始終設置默認值。 為了將來使用,用戶將覆蓋默認值並使用保存的設置。

使用以下命令更改讀取功能:

QVariant SettingsManager::read(const QString & key, const QVariant &defaultValue) const
{
    return settings.value(key,defaultValue);
}

而且無論您在哪里調用該函數,都始終提供默認值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM