Qt: избегайте перестройки приложений, если строки изменяются

0

Я хотел знать, какие мои параметры предназначены для хранения строк в приложении QT. Одно из моих основных требований в том, чтобы не перестраивать весь проект или какой-либо файл в случае, если одна строка изменяется, а также иметь все строки в одном месте. Короче говоря, я хотел бы иметь строки в одном месте и извлекать их во время запуска приложения

  • 2
    Если вы измените одну строку, вам нужно будет только восстановить одну . cpp и связать объектные модули, вряд ли полная перестройка проекта.
  • 0
    Даже если вы измените строку и сохраненный файл, компилятор будет искать метку времени для lib и .cpp, а cpp сохраняется позже, чем lib, он создаст один .cpp и затем создаст ссылку.
Показать ещё 2 комментария
Теги:
qt

4 ответа

3
Лучший ответ

Я использовал все элементы, о которых говорили в приведенных выше ответах.

XML, JSON, QSettings с файлами Ini, tr()

Все они могут сделать это просто отлично. Я собрал несколько заметок по различным параметрам:

QTranslator

Qt Linguist и теги tr() предназначены для того, чтобы взять ваш фондовый язык и перевести его на другой язык. Отслеживание нескольких версий перевода на английский язык и изменение/освобождение без Qt Linguist практически невозможно. Qt Linguist должен "освободить" ваши переводы и преобразовать их из файла TS (источника перевода) в оптимизированный файл QM.

Формат файла QM представляет собой компактный двоичный формат, который используется локализованным приложением. Он обеспечивает чрезвычайно быстрый поиск переводов.

Вот что выглядит с помощью файла перевода:

 QTranslator translator;
 translator.load("hellotr_la");
 app.installTranslator(&translator);

http://qt-project.org/doc/qt-4.8/qtranslator.html#details

Я думаю, что использование QTranslator для нескольких изменений строки может быть странным вариантом использования, если вы не используете для локализации вашей программы. Но, как говорят документы, он оптимизирован для очень быстрого поиска строк.

QXmlStreamReader

Считыватель потоков является "рекомендуемым" способом доступа к файлам XML или, по крайней мере, с лучшей поддержкой. Вы пишете свои собственные файлы для его организации или пишете код для генерации XML.

<STRING_1>Some string</STRING_1>

Вот как выглядит переход на xml.

QXmlStreamReader xml;
...
while (!xml.atEnd()) {
      xml.readNext();
      ... // do processing
}
if (xml.hasError()) {
      ... // do error handling
}

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

QJsonDocument

Поддержка JSON в Qt 5 выглядит действительно хорошо. Я еще не строил проект с ним. Это так же просто, как и выглядит, и что касается доступа и настройки, он выглядит так же, как с помощью словаря или карты или вектора.

UPDATE: вы просто передаете указатель на свой QJsonDocument или ваш QJsonObject или ваш QJsonArray когда вы более глубоко QJsonObject или QJsonArray больше в свой Json файл. И когда вы закончите, вы можете сохранить его как двоичный файл или как чистый текст, удобочитаемый файл, с правильным отступом и всем остальным!

Как создавать/читать/записывать файлы JSon в Qt5

Кажется, что Json превращается в замену XML для многих людей. Мне нравится пример использования Json для сохранения и загрузки состояния ролевой игры.

http://qt-project.org/doc/qt-5/qtcore-savegame-example.html

QSettings

QSettings является одним из моих фаворитов, только потому, что он поддерживается так долго, и именно так сохраняются и доступны самые постоянные настройки.

Когда я использую его, чтобы воспользоваться преимуществами по умолчанию и возвращать механизмы, я помещаю это в свой main.cpp:

 QCoreApplication::setOrganizationName("MySoft");
 QCoreApplication::setOrganizationDomain("mysoft.com");
 QCoreApplication::setApplicationName("Star Runner");

И поскольку мне иногда приходится редактировать эти настройки вручную в окнах, я использую формат Ini.

QSettings::setDefaultFormat(QSettings::IniFormat); // also in main.cpp

Затем, когда я развертываю exe, и я хочу, чтобы загружалось определенное значение вместо жестко заданных значений по умолчанию, установщик отключает основной резерв

C:/ProgramData/MySoft/Star Runner.ini

И когда программа сохраняет изменения во время выполнения, она сохраняется на:

C:/Users/<username>/AppData/Roaming/MySoft/Star Runner.ini

И затем в течение всей моей программы, если мне нужно получить настройку или установить настройку, она занимает 3 строки кода или меньше.

// setting the value
QSettings s;
s.setValue("Strings/string_1", "new string");


// getting the value
QString str;

QSettings s;
str = s.value("Strings/string_1", "default string").toString();

И вот что будет выглядеть ваш ini файл:

[Strings]
string_1=default string

QSettings - это способ пойти, если вы сохраняете несколько строк, которые хотите изменить при развертывании или во время выполнения. (или если флажок установлен, или размер и положение окна, или список последних файлов или что-то еще).

QSettings была оптимизирована совсем немного и хорошо продумана. Поддержка ini является удивительной, за исключением того, что она иногда переупорядочивает группы и ключи (обычно в алфавитном порядке), и она может отбрасывать любые комментарии, которые вы вставляете в нее. Я думаю, что комментарии ini начинаются с ; или #.

Надеюсь, это поможет.

3

Один из способов сделать это - поместить его в общую библиотеку. Таким образом, вы можете перекомпилировать только общую библиотеку, но не весь проект. Другим подходом было бы поместить его в файл или базу данных и загрузить его во время выполнения.

И, конечно же, вы должны проверить свои зависимые зависимости. Если вы включаете заголовки везде, компилятор перестраивает все, что от него зависит, даже если заголовок не нужен.

2

Еще одно возможное решение - заменить все строки по умолчанию внутри вызовов tr() и использовать Qt Linguist для управления всеми строками.

Вы также сможете загружать все "переводы" из внешнего файла .qm при запуске.

1

Это просто: сохраните свои изменчивые строки в QSettings http://qt-project.org/doc/qt-4.8/qsettings.html (вы можете использовать ini файлы или реестр) или XML файл, который сделает ваше приложение настраиваемым.

Редактировать: Хорошо, подумав об этом еще несколько минут, комментарий Гильерме прав. QSettings нужно будет каким-то образом инициализировать (либо вручную, либо с некоторыми значениями по умолчанию в вашем коде)... и, честно говоря, ручной редактор реестра для изменения нескольких строк - не самая яркая идея. Поэтому я пришел к выводу, что XML или JSON определенно лучше. Он имеет преимущества, например, вы можете сохранить несколько файлов конфигурации, которые позволяют вам переключать языки во время выполнения и т.д.

  • 0
    QSettings прежнему требует, чтобы строки были на первом месте для их «извлечения». Нет никакого смысла. Использование файла XML или JSON - это действительно правильный путь.
  • 0
    Я не возражаю против извлечения строк из приложения starrtup. @Vladmir, не могли бы вы немного объяснить, как это может работать?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню