Пожалуйста, сначала создайте экземпляр объекта QApplication

У меня есть статический класс, и я хочу, чтобы у него был статический класс QSettings,
Но с моей инициализацией я получаю предупреждение:

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

QCoreApplication :: applicationDirPath: Пожалуйста, сначала создайте экземпляр объекта QApplication

В качестве обходного пути я инициализирую QSetting вручную в начале моей основной функции. Есть ли лучший способ инициализировать мой статический член?

Спасибо!

2

Решение

В идеале у вас не должно быть никаких статических экземпляров классов. У синглетонов должен быть локальный экземпляр в main() и их статические методы должны перенаправлять через указатель экземпляра на обычные методы. Смотри как QCoraApplication делает это для хорошего примера.

В любом случае, QSettings экземпляр может быть эфемерным. Это всего лишь ручка к механизму настроек. Не имеет особого смысла делать его статичным или держать его вокруг. Это нормально иметь QSettings как локальная переменная в функции.

7

Другие решения

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,

1

По вопросам рекламы [email protected]