2

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

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

例如,我现在可以在脚本中执行此操作:

dialog.controls.okButton.setEnabled(false);

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

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

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

4

2 回答 2

2

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

 class Window : public QWidget
 {
     Q_OBJECT

 public:
     Window();
     void normalMethod();
     Q_INVOKABLE void invokableMethod();
 };
于 2011-10-20T20:06:44.403 回答
0

它必须是一个插槽,这是将您的函数公开给脚本引擎的硬性要求。Qt 对插槽做了一些额外的元对象的东西,使得访问它们成为可能。

您是否有理由不能只制作您想要调用插槽的功能?

于 2011-10-20T16:47:28.417 回答