C++ Qt:避免在字符串更改时重建应用程序
我想知道在QT应用程序中存储字符串的选项是什么。C++ Qt:避免在字符串更改时重建应用程序,c++,qt,C++,Qt,我想知道在QT应用程序中存储字符串的选项是什么。 我的一个主要要求是,在一个字符串发生变化时,不要重新构建整个项目或任何文件,也不要将所有字符串放在一个位置。简言之,我希望将字符串放在一个位置,并在应用程序启动时提取它们。一种方法是将其放在共享库中。这样,您只能重新编译共享库,而不能重新编译整个项目。另一种方法是将其放入文件或数据库中,并在运行时加载 当然,您必须检查您的include依赖项。如果到处都包含头,编译器将重建依赖于它的所有内容,即使头不是真正需要的。很简单:将易失性字符串存储在QS
我的一个主要要求是,在一个字符串发生变化时,不要重新构建整个项目或任何文件,也不要将所有字符串放在一个位置。简言之,我希望将字符串放在一个位置,并在应用程序启动时提取它们。一种方法是将其放在共享库中。这样,您只能重新编译共享库,而不能重新编译整个项目。另一种方法是将其放入文件或数据库中,并在运行时加载
当然,您必须检查您的include依赖项。如果到处都包含头,编译器将重建依赖于它的所有内容,即使头不是真正需要的。很简单:将易失性字符串存储在QSettings中,您可以使用ini文件或注册表或XML文件,这将使您的应用程序可配置
编辑:嗯,在考虑了几分钟之后,Guilherme的评论是正确的。QSettings将需要手动或从代码中的一些默认值进行初始化。。。老实说,手动编辑注册表来更改几个字符串并不是最聪明的主意。所以我得出结论,XML或JSON肯定更好。它有一些优点,例如,您可以保留多个配置文件,允许您在运行时切换语言等。另一种可能的解决方案是在tr调用中用默认字符串替换所有字符串,并使用Qt Lingualist管理所有字符串
您还可以在启动时加载外部.qm文件中的所有翻译。我已经使用了上述答案中提到的所有元素 XML、JSON、带Ini文件的QSettings、tr 他们都能做得很好。我总结了一些关于不同选项的注释: QTranslator Qt语言学家和tr标签旨在将您的常用语言翻译成另一种语言。如果没有Qt语言学家,跟踪英语翻译和修改/发布的多个版本几乎是不可能的。Qt语言学家需要发布您的翻译,并将其从TS文件翻译源转换为优化的QM文件 QM文件格式是本地化应用程序使用的压缩二进制格式。它提供了非常快速的翻译查找 下面是使用翻译文件的情况:
QTranslator translator;
translator.load("hellotr_la");
app.installTranslator(&translator);
我认为使用QTranslator进行一些字符串更改可能是一个奇怪的用例,除非您使用它来本地化您的程序。但正如文档所说,它针对字符串替换的快速查找进行了优化
QXMLStreamReader
建议使用流读取器来访问XML文件,或者至少提供更好的支持。您可以编写自己的文件来组织它,或者编写代码来生成XML
<STRING_1>Some string</STRING_1>
XML与Json非常相似,但文件更大,开始和结束标记更长。现在有更多的XML股票阅读器。在很多情况下,它也更容易让人阅读,因为很多人都知道html,而且他们非常相似
QJsonDocument
Qt5中的JSON支持看起来非常好。我还没有用它构建一个项目,但它看起来很简单,就访问和设置而言,它看起来就像使用字典、地图或向量一样
更新:您只需将指针传递到QJsonDocument、QJsonObject或QJsonArray中,就可以更深入地导航或将更多内容附加到Json文件中。完成后,您可以将其保存为二进制文件,或是具有适当缩进和所有内容的明文、人类可读文件
对于许多人来说,Json似乎正在成为XML的替代品。我喜欢使用Json保存和加载角色扮演游戏状态的示例
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
以下是您的ini文件的外观:
[Strings]
string_1=default string
如果要在部署时或运行时存储一些要更改的字符串,那么QSettings就是一种方法。或者,如果现在选中了复选框,或者窗口大小和位置,或者最近使用的文件列表,等等
QSettings经过了相当多的优化,并且经过了深思熟虑。ini支持非常棒,只是它有时会按字母顺序重新排列组和键,并且可能会删除您在其中输入的任何注释。
我认为ini评论要么是以一个开头;或者一个
希望这能有所帮助。如果更改单个字符串,只需重新生成单个字符串即可。cpp和重新链接对象模块,这几乎不是一个完整的项目重建。即使您更改字符串和保存的文件,编译器也会查找lib的时间戳。cpp和cpp的保存时间晚于lib,它将生成一个.cpp,然后链接。我想远离重建项目。使用qt Linguaster和translators tr函数及相关宏。然后将这些字符串保存在翻译文件中。QSettings仍然需要将这些字符串放在第一位才能提取它们。没有意义。使用XML或JSON文件确实是一种方法,我不介意在应用程序starrtup上提取字符串@Vladmir你能解释一下这是如何工作的吗?我的意思是,例如,你希望你的主窗口标题是可配置的。因此,您的QSettings ini或注册表中有一个条目—您需要调用MainWindow/Title,它包含标题字符串,并在启动时检索。我在我的答案中发布的链接中有很多例子。我发现恢复GUI应用程序状态的部分特别有用,尽管它与字符串无关。XML或JSON当然是一个选项,但在代码中需要做更多的工作。QSettings非常直接和简单。我编辑了我的答案以推荐XML或JSON而不是QSettings。感谢Guilherme的评论。
// 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();
[Strings]
string_1=default string