在我的主窗体之外使用 QtScript

Using QtScript outside my main form

本文关键字:QtScript 我的 窗体      更新时间:2023-10-16

我正在使用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) 与当前类中的对象一起使用,这工作正常(如果我输入不是级),但我也希望能够访问其他类中的对象(希望是我的应用程序通常使用的所有公共插槽)。

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

怎么

了?

我想这是因为您没有明确地将指向您的主窗体的指针传递给您的scriptingconsole的构造函数。这就是为什么你因此而NULL。(NULL是默认值,正如您可以在每个QWidget构造函数中看到QWidget *parent = 0

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

溶液

主窗体中动态分配scriptingconsole

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

QScriptEngine的Qt文档::newQObject说:

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

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

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