我的应用程序名为unwallpaper,我想获得它的应用程序数据路径:
qDebug() << QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);在Linux上返回/home/sign/.local/share,但是根据Qt文档的说法,应该返回的是/home/sign/.local/share/<APPNAME>。
我应该在某个地方设置APPNAME值吗?我正在使用和qmake。谢谢!
发布于 2017-03-24 10:39:45
根据应用程序名称文档
如果未设置,应用程序名称默认为可执行名称(自5.0起)。
奇怪的是,返回的路径根本没有包含<APPNAME>。
因此,更好的方法是显式设置应用程序名称和/或组织名称,如下所示:
QCoreApplication::setApplicationName("unwallpaper");
QCoreApplication::setOrganizationName("organization");发布于 2017-03-24 10:36:32
您应该使用QCoreApplication::applicationFilePath()。它返回应用程序可执行文件的文件路径(包括可执行文件名)。
发布于 2021-12-26 11:33:56
我也有过类似的问题并进行了调查。一般的原因可能是因为在QStandartPaths初始化之前调用了QApplication。如果在全局方法或静态方法中调用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 */
}https://stackoverflow.com/questions/42997067
复制相似问题