2016-08-19 80 views
2

我有一个静态类,并希望它具有静态QSettings。 但我跟我初始化得到一个警告:请首先实例化QApplication对象

QSettings* MySQLConnection::settings = new QSettings(QApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat); 

QCoreApplication :: applicationDirPath:请实例化QApplication对象第一

作为一种变通方法我手动初始化QSetting在我的主要的开始功能。有没有更好的方法来初始化我的静态成员?

谢谢!

回答

7

理想情况下,您应该没有任何静态类实例。单身人士应该在main()有一个本地实例,他们的静态方法应该通过实例指针转发到常规方法。看看QCoraApplication是如何做的一个很好的例子。

无论如何,QSettings实例可能是短暂的。这只是设置机制的一个处理。没有太多的意义,使其静态或保持周围。将QSettings作为函数中的局部变量是正常的。

+0

谢谢!我希望我现在能够以正确的方式实现一个单例(至少它能够工作,就在我学习设计模式的正确实现之前)。 第二点:每次需要使用它时,创建一个'QSettings'本地实例的好处是什么,而不是每个类创建一个实例作为私有成员? – honiahaka10

+0

让我们换一种说法:以其他方式做这件事没有任何好处。 'QSettings'是设置系统的句柄。无论如何都没有必要保留它,只是很少使用它。 –

+0

@ honiahaka10请你详细说明你是如何实现这个单身人士? – agbb

1

QApplication派生自QCoreApplication
你可以从sources看到,applicationDirPath被定义为:

QString QCoreApplication::applicationDirPath() 
{ 
    if (!self) { 
     qWarning("QCoreApplication::applicationDirPath: Please instantiate the QApplication object first"); 
     return QString(); 
    } 

    // ... more code 
} 

通过深入到代码中,我们发现,selfinit函数初始化,即由构造调用。
因此,除非您明确创建了Q*Application类的实例(本例中为QApplication的实例),否则它在我看来不会按预期的方式工作。从文档

注意上面,它被建议尽快建立这样一个类:

在一般情况下,我们建议您创建一个QCoreApplication,QGuiApplication或在主一个QApplication对象()尽可能早地发挥功能。在事件循环退出之前,exec()不会返回;例如,当调用quit()时。

这意味着甚至在尝试访问QApplication::applicationDirPath()之前,当然。
否则在使用QSettings时,您将无法从该方法中获得正确的路径。

+0

Tahnk你!我已经阅读过这篇文章,这就是为什么我要求一个正确的方法来解决这个问题。提到Kuba Ober时使用signleton解决了这个问题。 – honiahaka10