在我的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元素派生一个新类,它将这些方法重写为公共槽。但这意味着编码和维护需要很大的开销,这在这种情况下是不可取的。
有没有办法告诉脚本引擎默认提供正常的公共功能?
答案 0 :(得分:2)
根据Qt doc,还有另一种方法可以使公共方法可以被脚本访问(除了将它们声明为公共插槽之外):在方法声明前写下Q_INVOKABLE
关键字:
class Window : public QWidget
{
Q_OBJECT
public:
Window();
void normalMethod();
Q_INVOKABLE void invokableMethod();
};
答案 1 :(得分:0)
它必须是一个插槽,这是您的函数暴露给脚本引擎的硬性要求。 Qt向插槽中添加了一些额外的元对象内容,使其可以访问它们。
有没有理由你不能只调用你想要调用插槽的功能?