Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt:避免在字符串更改时重建应用程序_C++_Qt - Fatal编程技术网

C++ Qt:避免在字符串更改时重建应用程序

C++ Qt:避免在字符串更改时重建应用程序,c++,qt,C++,Qt,我想知道在QT应用程序中存储字符串的选项是什么。 我的一个主要要求是,在一个字符串发生变化时,不要重新构建整个项目或任何文件,也不要将所有字符串放在一个位置。简言之,我希望将字符串放在一个位置,并在应用程序启动时提取它们。一种方法是将其放在共享库中。这样,您只能重新编译共享库,而不能重新编译整个项目。另一种方法是将其放入文件或数据库中,并在运行时加载 当然,您必须检查您的include依赖项。如果到处都包含头,编译器将重建依赖于它的所有内容,即使头不是真正需要的。很简单:将易失性字符串存储在QS

我想知道在QT应用程序中存储字符串的选项是什么。
我的一个主要要求是,在一个字符串发生变化时,不要重新构建整个项目或任何文件,也不要将所有字符串放在一个位置。简言之,我希望将字符串放在一个位置,并在应用程序启动时提取它们。一种方法是将其放在共享库中。这样,您只能重新编译共享库,而不能重新编译整个项目。另一种方法是将其放入文件或数据库中,并在运行时加载


当然,您必须检查您的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