在我的主窗体外使用QtScript

时间:2015-01-12 12:29:19

标签: c++ qt

我正在使用 Qt5 ,并尝试了解如何使应用程序可编写脚本。

为此,我创建了一个主窗口,其中包含一些文本编辑标签等。然后我添加了一个名为“脚本控制台的选项“到那个表单”菜单,以便我打开第二个表单,其中只包含一个文本编辑和一个名为“评估”的按钮

我的目标是能够使用第二种形式并通过 Qt脚本引擎能够从我的主表单设置或获取值,并且通常能够编写各种功能的脚本。

我尝试做的是像这样设置引擎

scriptingconsole::scriptingconsole(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::scriptingconsole)
{
    ui->setupUi(this);
    QScriptValue appContext = myScriptEngine.newQObject(parent);
    myScriptEngine.globalObject().setProperty("app", appContext);
}

我没有得到我期待的东西。

如果我尝试评估表达“ app ”,我会将 null 作为输出。

如果我将 myScriptEngine.newQObject(parent)与当前类中的对象一起使用(如果不是 parent ,我输入 this ),但我希望能够访问其他类中的对象(希望我的应用程序通常使用的所有公共插槽)。

有谁知道我在这里做错了什么,我怎么能使用我的脚本控制台 从我的主窗口访问公共插槽的类?

2 个答案:

答案 0 :(得分:1)

怎么了?

我想这是因为你没有明确地将指向你的主表单的指针传递给scriptingconsole的构造函数。这就是你得到NULL的原因。 (NULL是默认设置,因为您可以在每个QWidget *parent = 0构造函数中看到QWidget

如果您的对象未动态实例化,则会发生这种情况。

解决方案

在主表单中动态分配scriptingconsole

scriptingconsole* myScriptConsole;

//...

myScriptConsole = new scriptingconsole(this); 
//                                     ^^^^
//                              pass the pointer which points to parent widget

答案 1 :(得分:1)

QScriptEngine :: newQObject的Qt文档说:

使用给定的所有权创建一个包装给定QObject对象的QtScript对象。给定的选项控制与生成的脚本对象的交互的各个方面。

http://qt-project.org/doc/qt-4.8/qscriptengine.html#newQObject

即。它包装一个QObject ..你可能因为某种原因将NULL传递给newQObject。尝试设置断点并评估“父母”的价值。