Как заставить JavaScript в QWebView создавать новые экземпляры основанных на C++ классов?

Это потому, что цикл for был определен таким образом в Спецификации языка Java .

14.14.1 Базовый для оператора

BasicForStatement:
    for ( ForInit ; Expression ; ForUpdate ) Statement

ForStatementNoShortIf:
    for ( ForInit ; Expression ; ForUpdate ) StatementNoShortIf

ForInit:
    StatementExpressionList
    LocalVariableDeclaration

ForUpdate:
    StatementExpressionList


StatementExpressionList:
    StatementExpression
    StatementExpressionList , StatementExpression

Таким образом, он должен быть StatementExpression или кратным StatementExpression с, а StatementExpression определяется как:

14.8 Операторы выражений

StatementExpression:
    Assignment
    PreIncrementExpression
    PreDecrementExpression
    PostIncrementExpression
    PostDecrementExpression
    MethodInvocation
    ClassInstanceCreationExpression

0 <= n ? (i++) : (i--) не относятся к числу таких, поэтому они не принимаются. i += ((0 <= n) ? 1 : -1) - это задание, поэтому оно работает.

6
задан feedc0de 17 August 2016 в 08:48
поделиться

3 ответа

Один довольно уродливый прием, который я рассмотрел, - это использовать addToJavaScriptWindowObject, чтобы отбросить объект, который я хочу вернуть, в объект окна со случайным именем, а затем заставить мой слот возвращать имя экземпляра объекта вместо этого:

QString MyApp::helloWorld()
{
     //general a unique name for the js variable
     QString name=getRandomVariableName();

     //here's the object we want to expose to js
     MyObject* pReturn=new MyObject();

     //we make attach our object to the js window object    
     getWebFrame()->addToJavaScriptWindowObject(name, pReturn,
         QScriptEngine::ScriptOwnership);  

     //tell js the name we used
     return name;
}

JS может быть написан, чтобы проверить, является ли возвращаемое значение строкой, и если это так, захватить объект из окна.:

var foo=myapp.helloWorld();
if (typeof foo == "string")
{
    foo=window[foo];
}

Немного уродливо, но я справлюсь, пока не появится лучший метод вместе. В будущих версиях Qt будет унифицирована поддержка сценариев, чтобы все они были основаны на JavaScriptCore в WebKit, так что, надеюсь, это улучшится!

3
ответ дан 17 December 2019 в 00:13
поделиться

QtScript имеет понятие прототипов, которое позволяет вам создавать прототип C ++ для значения скрипта. Мы исследуем, можем ли мы связать QtScript с JavaScriptCore - что должно привести к возможности использования прототипов из среды JavaScript WebKit; http://doc.trolltech.com/4.5/qtscript.html#making-use-of-prototype-based-inheritance

1
ответ дан 17 December 2019 в 00:13
поделиться

Попробуйте вернуть ваш новый объект как QObject *, а не как MyObject *. Если вы просто работаете с QtScript, вы можете вызвать qScriptRegisterMetaType , чтобы определить код для обработки преобразования MyObject * в QScriptValues ​​(или QVariants), но, похоже, нет эквивалента для Механизм JavaScript, используемый в QtWebKit.

К сожалению, это означает, что предоставление вашей внутренней объектной модели WebKit потребует либо наличия отдельного набора прокси-функций, которые преобразуют указатели ваших объектов в QObject * s, либо использования классов адаптеров какого-либо типа для выполнения то же самое.

1
ответ дан 17 December 2019 в 00:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: