Qt加载dll文件后在JavaScript中无法使用

实现目的:在Qt加载dll文件,dl文件实现提示框功能,dll文件的类为Operator,加载后作用js的一个属性被js使用。

问题:在js中就不能成功调用,并提示:
Uncaught exception at :/test.js:6: TypeError: Result of expression 'Operator.prompt' [undefined] is not a function.

图片说明

尝试在main.cpp中调用这个类的函数:
ope->prompt("Title","this is a Message","YesNoCancel");
可以正常调用。

确定设置Operator类的实例ope为JavaScript的属性的代码是没问题的:
scriptWidget[1] = engine->newQObject(ope);
engine->globalObject().setProperty("Operator", scriptWidget[1]);

我就觉得奇怪,怎么在main.cpp中可以正常调用,而设置到JS中就不能调用了呢?

该回答引用ChatGPT-3.5,仅供参考,不保证完全正确

这个问题可能是由于Qt的信号和槽机制导致的。在Qt中,当将一个QObject的实例设置为JavaScript的属性时,它将被视为一个Qt信号对象,而不是直接可调用的函数。这可能是为什么您在JavaScript中无法调用Operator类的函数。


要解决这个问题,您可以使用Qt的Q_INVOKABLE宏来声明Operator类中要在JavaScript中调用的函数。确保在Operator类的头文件中的函数声明前添加Q_INVOKABLE宏。例如:

class Operator : public QObject
{
    Q_OBJECT
public:
    Q_INVOKABLE void prompt(const QString& title, const QString& message, const QString& buttons);
    // 其他函数声明
};

然后,在您将Operator实例设置为JavaScript属性的代码之前,使用Q_DECLARE_METATYPE宏注册Operator类型。例如:

#include <QMetaType>

qRegisterMetaType<Operator>("Operator");

这将确保Qt能够正确处理Operator类型并使其可在JavaScript中调用。


最后,在将Operator实例设置为JavaScript属性的代码之前,确保在Qt的QScriptEngine中注册Operator类型。例如:

engine->globalObject().setProperty("Operator", engine->newQObject(ope));

通过这些步骤,您应该能够在JavaScript中成功调用Operator类的函数了。