【问题标题】:QJSEngine won't evaluate js array correctlyQJSEngine 不会正确评估 js 数组
【发布时间】:2018-09-29 21:00:45
【问题描述】:

我有一个文件settings.js,其中包含一个带有设置数组的数组:

[
// [property, section, hex-address, Bytes to read/write, type, lsb, msb, options]

    ["AEC Control" , "AEC Control", 0x10300, 4, "bool", 0, 0],
    ["Shutter Mode", "Sensor Mode", 0x10104, 4, "bool", 0, 0],
    ["Nb ADC", "Sensor Mode", 0x10108, 4, "bool", 0, 0],
    ...
]

如您所见,该文件仅包含数组值,没有赋值给变量,末尾没有分号。

settings.js 放在resources.qrc 内:

<RCC>
    <qresource prefix="/js">
        <file alias="CameraSettings">resources/settings.js</file>
    </qresource>
</RCC>

我阅读了settings.jsQFile。这是评估 javascript 的代码:

QFile cameraSettingsJsFile(":/js/CameraSettings");
if(!cameraSettingsJsFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
    throw std::exception("CameraSettingsProperties-file not valid!");
};

QJSEngine jsengine;
std::cout << "Output: '" << QTextStream(&cameraSettingsJsFile).readAll().toStdString() << "';" << std::endl;
QJSValue settingsArrayJSValue = jsengine.evaluate(QTextStream(&cameraSettingsJsFile).readAll());

由于 Output 行,我知道文件已正确读取,但 QJSEngine 不会正确评估该值。因为settingsArrayJSValue.isArray() 的计算结果为false,所以我在settingsArrayJSValue 上调用了所有is...() 函数。只有 settingsArrayJSValue.isUndefined() 评估为 true

我也试过这个:

jsengine.evaluate("x=" + QTextStream(&cameraSettingsJsFile).readAll() + ";");

然后settingsArrayJSValue.isObject() 评估为 true(在谈到 js 世界时,这是一种预期的方式),但我也得到一个 SyntaxError:Expected token 'numeric literal'

我在这里的最终目标是解析设置数组。因此,我想 JSON.stringify 评估的数组并使用 Qt QJson 类:

QJSValueList stringifyArguments;
stringifyArguments.append(settingsArrayJSValue);
QString evaluationResultString = jsengine
    .evaluate(QString("JSON.stringify"))
    .call(stringifyArguments)
    .toString();

QJsonArray jsonCameraSettingsArray = 
QJsonDocument::fromJson(evaluationResultString.toUtf8()).array();

为什么 QJSEngine 将有效数组评估为undefined

如何让 QJSEngine 正确评估数组以便我可以进一步处理它?

【问题讨论】:

    标签: javascript c++ qt qjsengine qt5.11


    【解决方案1】:

    问题出在这一行:

    std::cout << "Output: '" << QTextStream(&cameraSettingsJsFile).readAll().toStdString() << "';" << std::endl;
    

    因为我在那里读取了文件,所以当第二次尝试从cameraSettingsJsFile 读取时,QTextStream(&amp;cameraSettingsJsFile).readAll() 将是一个空字符串,因为指针已移动到流的末尾。

    所以 QJSEngine 工作正常...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 2015-11-14
      • 1970-01-01
      • 2019-05-10
      • 2018-08-01
      • 2014-01-26
      • 1970-01-01
      相关资源
      最近更新 更多