APPNAME 不包含在 QStandardPaths::AppDataLocation 中
APPNAME is not included in QStandardPaths::AppDataLocation
我的应用程序名为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 */
}