beachliu 2015-09-25 06:02 采纳率: 0%
浏览 1724

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中就不能调用了呢?

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-05-27 23:03
    关注

    该回答引用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类的函数了。

    评论

报告相同问题?

悬赏问题

  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题