在 Qml 和 javascript 中动态读取配置文件(javascript 文件或 json 文件)

Posted

技术标签:

【中文标题】在 Qml 和 javascript 中动态读取配置文件(javascript 文件或 json 文件)【英文标题】:Reading configuration file(javascript file or json file) on the fly in Qml and javascript 【发布时间】:2016-10-17 12:52:00 【问题描述】:

我是 Qt/Qml 和 javascript 的新手。 假设我有一个包含参数表的 javascript 文件。 javascript 文件在 Qml 中使用,它位于应用程序目录中。 e.g. C:\Program Files\QtApp\the_table.js.

如果最终客户安装了 Qt 应用程序,他们希望手动编辑 javascript 文件并将其与已安装的应用程序一起使用。 (无需重新编译应用程序源代码)。 我怎样才能让它发挥作用?

我曾尝试手动更新 javascript 文件,但当我再次尝试打开应用程序时,应用程序中未显示 javascript 文件中的“更新条目”。

-----------------8

更新:

包含在 qml 资源中的 Javascript 文件将不可编辑 最终用户无需重新编译应用程序。 qml 中的 Javascript 将主要保存逻辑,而不是数据。 最好使用 JSON 文件来存储最终用户可以修改的配置数据。 Qt 5.0 及更新版本支持读取 JSON 文件。 QJsonDocument。

【问题讨论】:

如果你的javascript文件是通过resources.qrc访问的,需要重新编译。否则,你确定要修改build目录下的文件吗? @user2436719 啊哈,你是对的。当前的 javascript 文件位于 resources.qrc 中。如何更改从可执行文件所在目录访问javascript文件? 也许你可以在这篇文章上工作qml-how-to-specify-image-file-path-relative-to-application-folder 【参考方案1】:

听起来您需要的灵活性应该在应用程序级别而不是外部实现。如果它只是一个“参数表”,那么在 JS 中有很多方法可以做到这一点。

由于您很可能不想打扰实现细节,这比更新实际的 JS 文件要好得多。

考虑使用import Qt.labs.settings 1.0,它允许您存储和更改在应用程序运行期间持续存在的设置。这比解析配置文件要容易一些。话虽如此,这样做是一个非常可行的选择,您只需将QDataStream 连接到 QML。

在不了解具体要求和使用场景的情况下,这是我能做的最好的事情。

好的,经过快速测试,似乎可以从文件系统导入文件,你只需要:

import "file:///pathToYourExecutable/YourScript.js" as YourScript

然后你可以在 QML 中使用YourScript。但是,我不建议使用它,因为它会带来弄乱应用程序的机会。用户不应该真正编辑任何文件来进行更改,这似乎是糟糕的设计。无论您想实现什么目标,都可能有更好的方法来实现。

【讨论】:

hmm,javascript文件实际上包含一个数组,该数组是在应用程序的Qml文件中通过for循环访问的。 所以这个 javascript 文件应该可以被最终用户编辑。在 Qml 中有“import the_table.js as ParamTable”语句。 目前在源代码的resources.qrc里面。如何更改可以找到正确javascript文件的Qml文件(将位于App.exe文件所在的同一目录中)。 编译后您不能对资源文件中的任何内容进行更改,这一点应该很明显。听起来您需要考虑我在答案第三段的第三句话中所描述的内容。每次应用程序启动时,公开一个数据流并从配置文件中读取数据。 :(无法理解如何使用Qt.labs.setting 1.0【参考方案2】:

改用json文件存储数据,然后在QML中访问json文件解决。

从磁盘读取json文件的类是Qt中的JsonFile类,查看这个链接: https://forum.qt.io/topic/39756/qml-and-js-reading-json-file-and-change-content-on-the-go

【讨论】:

以上是关于在 Qml 和 javascript 中动态读取配置文件(javascript 文件或 json 文件)的主要内容,如果未能解决你的问题,请参考以下文章

检查/访问 QML 中动态创建的对象

通过消息信号从 QML WorkerScript.sendMessage 调用传递数据

如何使 QML 容器中的最后一项填充剩余空间?

导入 JavaScript 时如何在 QML 中使用绝对路径?

QML 创建 TreeView 动态模型的正确方法是啥?

如何在 QML 视图之间动态更改