向现有QT应用程序添加javascript支持

向现有QT应用程序添加javascript支持,javascript,c++,qt,qtscript,Javascript,C++,Qt,Qtscript,我现在有一个功能强大的QT应用程序,有几个按钮 我需要直接从javascript控制我的应用程序,如下例所示,其中AccessControl是我的QObject类: AccessControl.configure("price",10); AccessControl.configure("autoClose",false); var ret = AccessControl.sendAskAliveMessage() ; if(!ret) { AccessControl.print("To

我现在有一个功能强大的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的初学者,我想做的就是让用户能够使用脚本,而不是点击UI

我已经阅读了QTScript文档,但是我确实有一些困难来理解它

如果有人能告诉我怎么做,或者你有一些好的简单的例子,那就太好了

有关我的问题的更多信息,请编辑:

我的应用程序是一个访问控制模拟器。我有几个按钮,以打开门,关闭它,配置价格。。。 我想编写这个应用程序的脚本,以便在没有需要单击UI的用户在场的情况下创建每个可能的测试用例


谢谢。

您可以将类连接到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++就是这样做的。这里是插槽的链接。QWebFrame可以向javascript添加对象并运行javascript代码

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

我发现了一个非常好的例子,他帮了我很多

您可以在此处找到代码:

Jay和Justin的回答是正确的,如果函数位于“公共槽”,则可以从脚本访问该函数

我的工作代码:

  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);
    }
  }

现在它工作正常,每次我按enter键时它都会评估我的脚本,因此,我可以在不关闭应用程序的情况下修改我的脚本,然后重新评估它。

您搜索过Qt脚本示例吗?是的,这些例子的问题是C++正在评估脚本,以便改变应用程序的协调。我想要执行我的脚本,以便在我的QT类中任意一个时隙。如果用一个时隙声明C++类,那么可以从脚本引擎调用时隙,而不需要任何额外的努力(至少在QT5.1 QML i中使用)。
class MyClass {
public slots:
 void doSomething(String info);