【问题标题】:APPNAME is not included in QStandardPaths::AppDataLocationAPPNAME 不包含在 QStandardPaths::AppDataLocation 中
【发布时间】:2017-08-17 05:57:30
【问题描述】:

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

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

这在 Linux 上返回 /home/sign/.local/share 但应该返回的是 /home/sign/.local/share/&lt;APPNAME&gt;,根据 Qt Document

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

【问题讨论】:

    标签: c++ linux qt


    【解决方案1】:

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

    /* 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 */
        
        }
    

    【讨论】:

      【解决方案2】:

      根据application name docs

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

      奇怪的是返回的路径根本不包含&lt;APPNAME&gt;

      因此,更好的方法是像这样显式设置application name 和/或organization name

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-04
          • 1970-01-01
          • 2023-03-24
          • 1970-01-01
          • 1970-01-01
          • 2011-11-28
          • 1970-01-01
          相关资源
          最近更新 更多