如何在QtScript中提供常规公共方法

时间:2011-10-20 16:02:24

标签: qt qtscript

在我的Qt应用程序中,使用QtScript的脚本可以访问对话框的所有控件。 为此,我使用QScriptEngine的newQObject方法,如:

QScriptValue btn = scriptEngine->newQObject(okBtn, QScriptEngine::QtOwnership);
controls.setProperty("okButton", btn, QScriptValue::ReadOnly);

E.g。我现在可以在脚本中执行此操作:

dialog.controls.okButton.setEnabled(false);

只要已发布控件( okButton )的调用方法( setEnabled )在公共插槽中标记为公共插槽,这就可以正常工作对象类。不幸的是,我希望能够从脚本调用的许多方法仅在普通的公共范围内定义。

解决此问题的一种方法是从每个Qt UI元素派生一个新类,它将这些方法重写为公共槽。但这意味着编码和维护需要很大的开销,这在这种情况下是不可取的。

有没有办法告诉脚本引擎默认提供正常的公共功能?

2 个答案:

答案 0 :(得分:2)

根据Qt doc,还有另一种方法可以使公共方法可以被脚本访问(除了将它们声明为公共插槽之外):在方法声明前写下Q_INVOKABLE关键字:

 class Window : public QWidget
 {
     Q_OBJECT

 public:
     Window();
     void normalMethod();
     Q_INVOKABLE void invokableMethod();
 };

答案 1 :(得分:0)

它必须是一个插槽,这是您的函数暴露给脚本引擎的硬性要求。 Qt向插槽中添加了一些额外的元对象内容,使其可以访问它们。

有没有理由你不能只调用你想要调用插槽的功能?