在我的主窗体之外使用 QtScript

Using QtScript outside my main form

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

为此,我创建了一个主要 window,其中包含一些 文本编辑 标签 等。然后我添加了一个该表单菜单中名为“script console”的选项,以便我打开第二个仅包含 text edit按钮调用了“评估”。

我的目标是能够使用第二种形式并通过 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) 与当前 class 中的对象一起使用(如果不是 parent 我输入 this),但我也希望能够访问其他 classes 中的对象(希望所有使用的 public 插槽一般由我的应用程序)。

有谁知道我在这里做错了什么以及如何使用我的脚本控制台 class 从我的主 window?

访问 public 个插槽

怎么了?

我猜这是因为您没有明确地将指向主窗体的指针传递给 scriptingconsole 的构造函数。这就是您得到 NULL 结果的原因。 (NULL 是默认值,正如您在每个 QWidget 构造函数中看到的 QWidget *parent = 0 一样)

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

解决方案

在您的主窗体中动态分配 scriptingconsole

scriptingconsole* myScriptConsole;

//...

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

QScriptEngine::newQObject 的 Qt 文档说:

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

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

即它 wraps 一个 QObject.. 无论出于何种原因,您都可能将 NULL 传递给 newQObject。尝试设置断点并评估 'parent'.

的值