QJSEngine не будет правильно оценивать массив js - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть файл 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), но я также получаю 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правильно оценить массив, чтобы я мог обработать его дальше?

1 Ответ

0 голосов
/ 30 сентября 2018

Проблема была в следующей строке:

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

Поскольку я читаю файл там, при попытке прочитать из cameraSettingsJsFile второй раз QTextStream(&cameraSettingsJsFile).readAll() будет пустой строкой, поскольку указатель перемещен наконец потока.

Так что QJSEngine работает нормально ...

...