QJSEngine 不会正确评估 js 数组
QJSEngine won't evaluate js array correctly
我有一个文件 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>
我用 QFile
阅读了 settings.js
。这是评估 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 正确评估数组以便我可以进一步处理它?
问题出在这一行:
std::cout << "Output: '" << QTextStream(&cameraSettingsJsFile).readAll().toStdString() << "';" << std::endl;
因为我在那里读取文件,当第二次尝试从 cameraSettingsJsFile
读取时,QTextStream(&cameraSettingsJsFile).readAll()
将是一个空字符串,因为指针已移动到流的末尾。
所以QJSEngine工作正常...
我有一个文件 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>
我用 QFile
阅读了 settings.js
。这是评估 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 正确评估数组以便我可以进一步处理它?
问题出在这一行:
std::cout << "Output: '" << QTextStream(&cameraSettingsJsFile).readAll().toStdString() << "';" << std::endl;
因为我在那里读取文件,当第二次尝试从 cameraSettingsJsFile
读取时,QTextStream(&cameraSettingsJsFile).readAll()
将是一个空字符串,因为指针已移动到流的末尾。
所以QJSEngine工作正常...