APPNAME 不包含在 QStandardPaths::AppDataLocation 中

APPNAME is not included in QStandardPaths::AppDataLocation

本文关键字:AppDataLocation QStandardPaths 包含 APPNAME      更新时间:2023-10-16

我的应用程序名为unwallpaper,我想获取其应用程序数据路径:

qDebug() << QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);

根据Qt文档,这个返回/home/sign/.local/share Linux上,但应该返回的是/home/sign/.local/share/<APPNAME>

我应该在某处设置 APPNAME 值吗?我正在使用Qt Creator和qmake。谢谢!

根据应用程序名称文档:

如果未设置,则应用程序名称默认为可执行文件名称(从 5.0 开始(。

奇怪的是,返回的路径根本没有包含<APPNAME>

因此,更好的方法是显式设置应用程序名称和/或组织名称,如下所示:

QCoreApplication::setApplicationName("unwallpaper");
QCoreApplication::setOrganizationName("organization");

你应该使用 QCoreApplication::applicationFilePath((。它返回应用程序可执行文件的文件路径(包括可执行文件名(。

我遇到了类似的问题并进行了调查。一般可能的原因是,您在 QApplication 初始化之前调用了 QStandartPaths。这可能是如果您在全局或静态方法中调用QStandartPaths。通常,要小心全局和静态初始化,因为它在主 {} 启动之前执行。错误的例子:

/* includes etc */

class A
{
public:
    
    A();
    
//.....
}

class B
{
public:
    B() {};
//.....
private:
    static A* a;
}

B::a = new A();
/* A::A prints path(s) without AppName because at the moment of
initialisation main not started yet and AppName not assigned */

main
{
    QApplication ap(argc, argv); 
    ap.setApplicationName("AppName");
    ap.setApplicationDisplayName("AppDisplayName");

    new B();
}
void A::A()
{
    qDebug() << QStandardPaths::AppConfigLocation; 
}

正确的示例:

    /* includes etc */
    
    class A
    {
    public:
        
        A();
        
    //.....
    
    }
    class B
    
    {
    public:
    
        B();
    
    //.....
    
    private:
    
        static A* a;
    }
    B::a = nullptr;
    
    main
    {
        QApplication ap(argc, argv); 
        ap.setApplicationName("AppName");
        ap.setApplicationDisplayName("AppDisplayName");
    
        new B();
    
    }
    
    void A::A()
    {
        qDebug() << QStandardPaths::AppConfigLocation; 
    }
    
    void B::B()
    {
        if (a == nullptr) a = new A();
    /* A::A prints correct path(s) because all constructors invoked after QApplication initialization.
       if protects static a from re-initialization on multiple B creation */
    
    }