我正在使用 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 ),但我希望能够访问其他类中的对象(希望我的应用程序通常使用的所有公共插槽)。
有谁知道我在这里做错了什么,我怎么能使用我的脚本控制台 从我的主窗口访问公共插槽的类?
答案 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。尝试设置断点并评估“父母”的价值。