Добавить поддержку JavaScript в существующее приложение QT

У меня сейчас есть функциональное приложение QT с несколькими кнопками.

Мне нужно управлять своим приложением напрямую из javascript, как в следующем примере, где AccessControl — это мой класс QObject:

AccessControl.configure("price",10);
AccessControl.configure("autoClose",false);
var ret = AccessControl.sendAskAliveMessage() ;
if(!ret)
{
AccessControl.print("Toll not found");
}
else
{
ret = AccessControl.SendTransactionMessage() ;

if(ret)
{
AccessControl.Open();
wait(10000);
AccessControl.Close();
}
else
{
AccessControl.printError(ret);
}
}

Мое существующее приложение соединяет сигналы и слоты так:

QObject::connect(&w, SIGNAL(SendTransaction()),
&Toll, SLOT(SendTransactionMessage()));

Я новичок в QT, и все, что я хочу сделать, это дать пользователю возможность использовать сценарии вместо того, чтобы нажимать на пользовательский интерфейс.

Я прочитал документацию по QTScript, но у меня действительно есть некоторые трудности, чтобы понять это.

Если кто-нибудь может объяснить мне, как это сделать, или если у вас есть хороший и простой пример для понимания, это будет здорово!

РЕДАКТИРОВАТЬ для получения дополнительной информации по моему вопросу:

Мое приложение — симулятор контроля доступа. У меня есть несколько кнопок, чтобы открыть дверь, закрыть ее, настроить цену, …
Я хочу написать сценарий этого приложения, чтобы создать тест на каждый возможный случай, без присутствия пользователя, которому нужно нажать на пользовательский интерфейс.

Благодарю.

1

Решение

Вы можете подключить класс к JavaScript. Вот пример PySide Python.

class MyCLass(object):
@QtCore.Slot(str)
def doSomething(self, info):
# do something with the string info here

frame.addToJavaScriptWindowObject("varName", MyClass)
frame.evaluateJavaScript("varName.doSomething('string')")

Я думаю, что это то, как вы делаете это в C ++. Вот ссылка на слоты http://qt-project.org/doc/qt-4.8/signalsandslots.html. QWebFrame может добавить объект в javascript и запустить код javascript.

class MyClass {
public slots:
void doSomething(String info);
1

Другие решения

Я нашел действительно хороший пример, который мне очень помог.

Вы можете найти код здесь: QTScriptTest

Ответ Джея и Джастина верен, если функция находится в «публичном слоте», она будет доступна из скрипта.

Мой рабочий код:

  MyClass AccessControl();

QScriptEngine scriptEngine;

QScriptValue AccessControlValue = scriptEngine.newQObject(&AccessControl);
Q_ASSERT (AccessControl.isQObject());

scriptEngine.globalObject().setProperty("AccessControl", AccessControlValue);

[...]//SLOT and SIGNAL connection

while(getchar() != 'q')
{
QFile file("Script.js");
file.open(QIODevice::ReadOnly);
QScriptValue result = scriptEngine.evaluate(file.readAll());

if(result.toString() != "undefined")
std::cout << result.toString().toStdString() << std::endl;

file.close();

if (scriptEngine.hasUncaughtException())
{
int lineNo = scriptEngine.uncaughtExceptionLineNumber();
printf("lineNo : %i", lineNo);
}
}

С примером Джастина:

class MyClass {
public slots:
void doSomething(String info);

Теперь он работает нормально и каждый раз, когда я нажимаю клавишу ввода, он оценивает мой скрипт, поэтому я могу изменить свой скрипт, не закрывая приложение, и просто переоценить его.

0

По вопросам рекламы [email protected]