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

时间:2013-11-26 09:22:49

标签: javascript c++ qt qtscript

我有一个功能齐全的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。

感谢。

2 个答案:

答案 0 :(得分: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 :(得分:0)

我找到了一个非常好的例子,他帮助了我很多。

您可以在此处找到代码: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);
    }
  }

以Justin为例:

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

现在它运行正常,每次按Enter键都会评估我的脚本,因此,我可以修改我的脚本而不关闭我的应用程序,只需重新评估它。