У меня есть статический класс, и я хочу, чтобы у него был статический класс QSettings
,
Но с моей инициализацией я получаю предупреждение:
QSettings* MySQLConnection::settings = new QSettings(QApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat);
QCoreApplication :: applicationDirPath: Пожалуйста, сначала создайте экземпляр объекта QApplication
В качестве обходного пути я инициализирую QSetting
вручную в начале моей основной функции. Есть ли лучший способ инициализировать мой статический член?
Спасибо!
В идеале у вас не должно быть никаких статических экземпляров классов. У синглетонов должен быть локальный экземпляр в main()
и их статические методы должны перенаправлять через указатель экземпляра на обычные методы. Смотри как QCoraApplication
делает это для хорошего примера.
В любом случае, QSettings
экземпляр может быть эфемерным. Это всего лишь ручка к механизму настроек. Не имеет особого смысла делать его статичным или держать его вокруг. Это нормально иметь QSettings
как локальная переменная в функции.
QApplication
происходит от QCoreApplication
,
Как вы можете видеть из источники, applicationDirPath
определяется как:
QString QCoreApplication::applicationDirPath()
{
if (!self) {
qWarning("QCoreApplication::applicationDirPath: Please instantiate the QApplication object first");
return QString();
}
// ... more code
}
Идя глубже в код, мы находим, что self
инициализируется init
функция, которая вызывается конструктором.
Из-за этого мне кажется, что он не будет работать так, как вы ожидаете, если вы явно не создали экземпляр Q*Application
класс (в этом случае, экземпляр QApplication
).
Обратите внимание, из документации выше, что предлагается создать такой класс как можно скорее:
В общем, мы рекомендуем вам как можно раньше создать объект QCoreApplication, QGuiApplication или объект QApplication в функции main (). exec () не вернется, пока не завершится цикл обработки событий; например, когда вызывается quit ().
Это означает, что даже прежде, чем вы попытаетесь получить доступ к QApplication::applicationDirPath()
, конечно.
В противном случае вы не сможете получить правильный путь от этого метода при использовании QSettings
,