2016-08-19 79 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