- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想知道在 QT 应用程序中存储字符串的选项是什么。我的主要要求之一是不重建整个项目或任何文件,以防万一一个字符串发生变化,并将所有字符串放在一个地方。简而言之,我想将字符串放在一个地方并在应用程序启动期间提取它们
最佳答案
我已经使用了上述答案中提到的所有元素。
XML
、JSON
、QSettings
带 Ini 文件、tr()
他们都可以做得很好。我整理了一些关于不同选项的注释:
Qt Linguist 和 tr()
标签旨在获取您的常用语言并将其翻译成另一种语言。在没有 Qt Linguist 的情况下跟踪多个版本的英文翻译和修改/发布几乎是不可能的。 Qt Linguist 需要“发布”您的翻译并将其从 TS 文件(翻译源)转换为优化的 QM 文件。
The QM file format is a compact binary format that is used by the localized application. It provides extremely fast lookups for translations.
这是使用翻译文件的样子:
QTranslator translator;
translator.load("hellotr_la");
app.installTranslator(&translator);
http://qt-project.org/doc/qt-4.8/qtranslator.html#details
我认为使用 QTranslator
进行一些字符串更改可能是一个奇怪的用例,除非您使用它来本地化您的程序。但正如文档所说,它针对非常快速的字符串替换查找进行了优化。
流阅读器是访问 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,而且它们非常相似。
Qt 5 中的 JSON 支持看起来非常好。
我还没有用它构建一个项目
它看起来很简单,就访问和设置而言,它看起来就像使用字典、 map 或 vector 一样。
更新:您只需将指针传递到您的 QJsonDocument
或您的 QJsonObject
或您的 QJsonArray
中,因为您正在深入导航或将更多内容附加到你的 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 是我的最爱之一,因为它得到了很长时间的支持,而且大多数持久性设置都应该以这种方式保存和访问。
当我使用它时,为了利用默认值和回退机制,我将它放在我的 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 注释要么以 ;
开头,要么以 #
开头。
希望对您有所帮助。
关于c++ - Qt : Avoid Rebuilding Applications incase strings change,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20901247/
我将从 ColdFusion 8 迁移到 ColdFusion 10。 目前,在我的Unix根目录下,我只有1个Application.cfm,在这个根目录下我有大约10个子目录(以前的程序员就是这样
这个问题在这里已经有了答案: Is it possible to write a program in Java without main() using JDK 1.7 or higher? [d
我是编写 Windows 服务应用程序的新手,并且遇到了问题。 我用 Delphi 编写了一个普通的 Windows 应用程序来检查和调试代码的主要部分,现在必须将其转换为 NT 服务。 我的代码必须
我在 Visual Studio 2013 中运行它。 对于 Application.Current.Shutdown 我得到: “Application”是“System.Windows.Appli
给定以下 C++ 代码“mini.cpp”: #include "iostream" using namespace std; int main() { cout << "Hello Worl
什么是“服务器应用程序”?我被要求写一篇关于“服务器应用程序”中的错误的文章,但我不熟悉确切的术语。它们只是网络应用程序,还是其他东西? 最佳答案 “服务器应用程序”是一种应用程序,它等待来自其他应用
JavaFX 应用程序类必须扩展 javafx.application.Application package automationFramework import java.util.concurr
I have implemented deeplinking in my application that open my app (if available) but my app opens
我被困在一个非常基本的问题上。我使用 JavaFX 创建了一个简单的 hello world 程序,它在 JDK 1.8 上运行良好。但是当我切换到 JDK-11 时,它会抛出以下异常: Error:
我可以让Application Insights显示正在运行的每小时使用情况日志,但是有没有一种方法可以每小时显示一次平均使用情况,以查看必须在一天中的哪个时段使用网站? 最佳答案 在您的资源的概览
有谁知道为什么在.NET应用程序中实现Application Insights时不会收集用户代理信息,却能够在浏览器中收集统计信息? 我很希望能够针对特定的用户代理字符串过滤出请求,但是看起来我无法看
我有多个应用程序使用 Application Insights for Production Data。我正在尝试使用 City 遥测字段来映射我们当前的用户。这些数据的跟踪似乎非常不一致,并且在大多
有没有办法在 ASP.NET Web 应用程序中禁用 Application Insights?假设我想关闭生产中运行的应用程序中的所有数据收集。 最佳答案 如果 ikey 在 Application
如何在 Azure Application Insights 中将时差转换为毫秒 let startTime = todatetime('2017-05-15T17:02:23.7148691Z');
我正在修改一个用 Coldfusion 编码的现有 Web 应用程序。在现有代码中,大部分文件夹包含一个 Application.cfm 文件,该文件设置应用程序变量 但是,我对这些应用程序的部分修改
我在 Application Insights Analytics 中有一些数据,它有一个动态对象作为自定义维度的属性。例如: | timestamp | name
首先,我需要的是-n WebBrowser-s,每个都在自己的窗口中执行自己的工作。用户应该能够看到所有这些内容,或者仅看到其中一个(或不显示任何内容),并且能够对每一个执行命令。有一个主要形式,没有
我已收到以下代码以添加到封闭代码(受密码保护)中,以便可以发现错误。 On Error Resume Next: Err.Clear Application.SetOption "Error Trap
我正在使用 Delphi 7。我试图在非 VCL 单元中添加一个调用“application.processmessages”的过程。我收到错误“未声明的标识符:应用程序”。 如何从非 vcl 单元引
考虑一个非外汇现有应用程序,我们将其称为Business。 Business 公开一个 Model 对象,该对象又公开一些属性。 Model 还接受这些属性的监听器。 我的问题是关于向此类应用程序添加
我是一名优秀的程序员,十分优秀!