QJSEngine无法正确评估js数组

时间:2018-09-29 21:00:46

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

我有一个文件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.js阅读了QFile。这是评估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 ,因此我在is...()上调用了所有settingsArrayJSValue函数。只有settingsArrayJSValue.isUndefined()的评估结果为 true

我也尝试过:

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

然后settingsArrayJSValue.isObject()的评估结果为 true (这在谈到js世界时是可以预期的),但我也得到了SyntaxErrorExpected token 'numeric literal'

我这里的最终目标是解析setttings数组。因此,我想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正确评估数组,以便我可以对其进行进一步处理?

1 个答案:

答案 0 :(得分:0)

问题出在这一行:

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

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

所以QJSEngine可以正常工作...