QJSEngine-暴露类和抛出错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QJSEngine-暴露类和抛出错误相关的知识,希望对你有一定的参考价值。

[我正在尝试创建一个标准的JS库,它的形状大多像Qbs(使用已弃用的QScriptEngine)和QJSEngine,因此制作Qt软件的人可以在其插件JS环境中添加诸如文件操作之类的东西。 >

您可以看到存储库here

我已经向JS引擎公开了基本类,如下所示:

QJSEngine jsEngine;
jsEngine.installExtensions(QJSEngine::AllExtensions);

jsEngine.globalObject().setProperty("BinaryFile", jsEngine.newQMetaObject(&Qbs4QJS::BinaryFile::staticMetaObject));

但是我似乎可以弄清楚如何在函数内获取对QJSEngine的引用,因此我可以抛出错误:

Q_INVOKABLE BinaryFile(const QString &filePath, QIODevice::OpenModeFlag mode = QIODevice::ReadOnly) 
    m_file = new QFile(filePath);
    if (!m_file->open(mode)) 
        // how do I get jsEngine, here
        jsEngine->throwError(m_file->errorString());
    

[如果我能以某种方式从函数内部派生调用引擎,则很喜欢,因此该类可以公开给几个单独的引擎实例。

我看到了QScriptable,它是engine()方法,但不知道如何使用它。

我添加了

Depends  name: "Qt.script" 

在我的qbs文件中,和

#include <QtScript>

但是它仍然不会抛出错误(只是默默地失败):

#include <QObject>
#include <QString>
#include <QFile>
#include <QIODevice>
#include <QFileInfo>
#include <QtScript>

namespace Qbs4QJS 

class BinaryFile :  public QObject, protected QScriptable

    Q_OBJECT

public:
    Q_ENUM(QIODevice::OpenModeFlag)

    Q_INVOKABLE BinaryFile(const QString &filePath, QIODevice::OpenModeFlag mode = QIODevice::ReadOnly) 
        m_file = new QFile(filePath);
        // should check for false and throw error with jsEngine->throwError(m_file->errorString());
        if (!m_file->open(mode))
            context()->throwError(m_file->errorString());
        
    

private:
    QFile *m_file = nullptr;
;

 // end namespace Qbs4QJS

我对此也可能感到困惑,但是似乎它正在使用QScriptEngine,但我想摆脱它。

完成添加QJSEngine可以使用的类的最佳方法是什么,该类具有cpp定义的方法,这些方法可能在调用引擎中引发错误?

我正在尝试使用QJSEngine创建一个标准的JS库,其形状大体上类似于Qbs(使用过时的QScriptEngine),因此制作Qt软件的人可以向...添加文件操作之类的东西...]

答案
正在构造的对象尚未与QJSEngine有任何关联。因此,您只能执行以下一种选择:

    如果可以确保整个应用程序中只有一个QJSEngine实例,请将引擎实例存储在静态变量中。

以上是关于QJSEngine-暴露类和抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

js 捕获异常和抛出异常

Boost.Python 列出所有暴露的类和属性

CodeIgniter 和抛出异常

JS异常捕获和抛出

Kotlin 协程协程异常处理 ① ( 根协程异常处理 | 自动传播异常 | 在协程体捕获异常 | 向用户暴露异常 | 在 await 处捕获异常 | 非根协程异常处理 | 异常传播特性 )

Kotlin 协程协程异常处理 ① ( 根协程异常处理 | 自动传播异常 | 在协程体捕获异常 | 向用户暴露异常 | 在 await 处捕获异常 | 非根协程异常处理 | 异常传播特性 )