У меня сейчас есть функциональное приложение 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, но у меня действительно есть некоторые трудности, чтобы понять это.
Если кто-нибудь может объяснить мне, как это сделать, или если у вас есть хороший и простой пример для понимания, это будет здорово!
РЕДАКТИРОВАТЬ для получения дополнительной информации по моему вопросу:
Мое приложение — симулятор контроля доступа. У меня есть несколько кнопок, чтобы открыть дверь, закрыть ее, настроить цену, …
Я хочу написать сценарий этого приложения, чтобы создать тест на каждый возможный случай, без присутствия пользователя, которому нужно нажать на пользовательский интерфейс.
Благодарю.
Вы можете подключить класс к 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);
Я нашел действительно хороший пример, который мне очень помог.
Вы можете найти код здесь: 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);
Теперь он работает нормально и каждый раз, когда я нажимаю клавишу ввода, он оценивает мой скрипт, поэтому я могу изменить свой скрипт, не закрывая приложение, и просто переоценить его.