JSFunction как параметр в слоте Qt? - PullRequest
0 голосов
/ 26 декабря 2010

Я хочу написать слот Qt, подобный следующему javascript,

function testFunc( func1,func2,cond )
{
   if ( cond == 1)
   {
            func1();
   }
  else
  {
           func2();
  }
}

Вопросы для меня:

1).как получить функцию Javascript в качестве аргумента?
2).как снова вызвать ту же функцию JS из C ++.

Вот мои неэффективные решения,

Для Q.1-> принятие аргумента JSFunction в качестве QString дает мне полный код функции,в этом случае мне нужно написать код для извлечения оттуда только имени функции.

Для Q.2-> я могу вызвать функцию JS с помощью QWebFrame ::valuJavaScript, но для этого мне нужно построить строку имени функции+ все аргументы функции.

Так есть ли лучшие решения для этой проблемы?

1 Ответ

2 голосов
/ 26 декабря 2010

К сожалению, в QtWebKit на данный момент невозможно сделать это более чистым способом. Были некоторые попытки добавить полные привязки JavaScript <-> C ++ к QtWebKit поверх QtScript, но я не уверен, каков прогресс в этом.

Это означает, что вы остались с двумя упомянутыми вами решениями (но я настоятельно рекомендую избегать первого, поскольку оно хакерское и не работает с объектами анонимных функций).

Другим решением было бы создать два сигнала: conditionSatisfied () и conditionFailed () и подключить их к func1, func2 соответственно:

function func1() { ... }
function func2() { ... }

object.conditionSatisfied.connect(func1);
object.conditionFailed.connect(func2);

Затем, на стороне C ++:

void X::testFunc(const QVariant& cond)
{
    if (cond.toInt() == 1)
        emit conditionSatisfied();
    else
        emit conditionFailed();
}

Это не очень хороший дизайн, но вы не можете сделать лучше.

...