Qt:避免重建应用程序变换字符串

时间:2014-01-03 10:13:47

标签: c++ qt

我想知道在QT应用程序中存储字符串的选项。 我没有重新构建整个项目或任何文件的主要要求之一是一个字符串更改并且还将所有字符串放在一个位置。简而言之,我希望将字符串放在一个位置并在Application启动期间提取它们

4 个答案:

答案 0 :(得分:3)

执行此操作的一种方法是将其放在共享库中。这样,您只能重新编译共享库,而不能重新编译整个项目。另一种方法是将其放在文件或数据库中并在运行时加载它。

当然,您必须检查包含依赖项。如果你在任何地方包含标题,编译器将重建依赖它的所有内容,即使实际上不需要标题。

答案 1 :(得分:3)

我已经使用了上述答案中谈到的所有元素。

XMLJSONQSettings w / Ini文件,tr()

他们都可以做得很好。我已经在不同的选项上记下了一些注意事项:

QTranslator

Qt Linguist和tr()标签旨在采用您的库存语言并将其翻译成另一种语言。在没有Qt语言学家的情况下跟踪英语翻译的多个版本以及修改/发布几乎是不可能的。 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

Qt 5中的JSON支持看起来非常好。 我还没有用它构建一个项目它看起来很简单,就访问和设置而言,它看起来就像使用字典或地图或矢量。

更新:您只需将指针传递到QJsonDocumentQJsonObjectQJsonArray,因为您正在深入导航或将更多内容附加到Json文件上。当你完成后,你可以将它保存为二进制文件,或者作为一个明文,人类可读的文件,并有适当的缩进和一切!

How to create/read/write JSon files in 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");

因为我有时需要在Windows中手动编辑这些设置,所以我使用的是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评论是以;#开始的。

希望有所帮助。

答案 2 :(得分:2)

另一种可能的解决方案是用tr()次调用中的默认字符串替换所有字符串,并使用Qt Linguist管理所有字符串。

您还可以在启动时从外部.qm文件加载所有“翻译”。

答案 3 :(得分:1)

很简单:将易失性字符串存储在QSettings http://qt-project.org/doc/qt-4.8/qsettings.html(您可以使用ini文件或注册表)或XML文件中,这将使您的应用程序可配置。

编辑:好吧,经过几分钟的考虑,Guilherme的评论是正确的。 QSettings需要以某种方式初始化(​​手动或从代码中的某些默认值)...并且说实话,手动编辑注册表来更改一些字符串并不是最明智的想法。所以我得出结论,XML或JSON肯定更好。它具有优势,例如,您可以保留多个配置文件,允许您在运行时切换语言等。