- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个标准的 JS 库,它的形状主要像 Qbs(它使用已弃用的 QScriptEngine
)和 QJSEngine
,因此制作 Qt 软件的人可以添加东西比如对他们的插件 JS 环境的文件操作。
你可以看到 repo 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
有任何关联。所以你只能做以下选择之一:
QJSEngine
实例,则将引擎实例存储在静态变量中。QThreadStorage
) 中。QJSValue
参数中检索引擎。解决方案 4:通过 QJSValue
参数隐式传递引擎。
我假设你的抛出构造函数总是有一个参数。 QJSValue
有一个(已弃用)方法 engine()然后你可以使用。您可以将 Q_INVOKABLE
方法中的任何参数替换为 QJSValue
而不是使用 QString
和 friend 。
class TextFileJsExtension : public QObject
{
Q_OBJECT
public:
Q_INVOKABLE TextFileJsExtension(const QJSValue &filename);
};
TextFileJsExtension::TextFileJsExtension(const QJSValue &filename)
{
QJSEngine *engine = filename.engine();
if (engine)
engine->throwError(QLatin1String("blabla"));
}
我想它被弃用是有原因的,所以您可以询问 QML 团队,为什么以及您可以使用什么替代方案。
解决方案 5 为构造函数实现一个 JS 包装器
这建立在解决方案 4 的基础上,甚至适用于无参数构造函数。而不是像这样直接注册你的帮助类:
engine->globalObject().setProperty("TextFile", engine->newQMetaObject(&TextFile::staticMetaObject));
您可以在 JS 中编写一个额外的生成器类和一个构造函数包装器。评估包装器并将此函数注册为您的类的构造函数。这个包装函数会将所有需要的参数传递给工厂方法。像这样:
engine->evaluate("function TextFile(path) { return TextFileCreator.createObject(path);
TextFileCreator
是一个帮助程序类,您可以将其注册为单例。 createObject()
方法将最终创建 TextFile
对象并将引擎作为参数传递:
QJSValue TextFileCreator::createObject(const QString &path)
{
QJSEngine *engine = qmlEngine(this);
return engine->createQObject(new TextFile(engine, filePath));
}
这使您可以在 TextFile
构造函数中访问 QJSEngine,并且可以调用 throwError()。
关于c++ - QJSEngine - 暴露类并抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61450160/
尝试以子类 QObject 作为参数执行小脚本。 QJSEngine jsEngine; QJSValue arg = jsEngine.newQObject(child); // Child it'
我正在尝试创建一个标准的 JS 库,它的形状主要像 Qbs(它使用已弃用的 QScriptEngine)和 QJSEngine,因此制作 Qt 软件的人可以添加东西比如对他们的插件 JS 环境的文件操
我正在将 QScriptEngine 代码迁移到 QJSEngine,并且遇到了一个问题,我无法在评估脚本后调用函数: #include #include int main(int argc, c
如果评估某个具有无限循环的脚本,如何中止评估过程。 例如:在后台线程中评估一些有问题的 JS: QJS引擎引擎; void threadproc() { engine.evaluate("wh
我可以访问传递给 QJSEngine 的 QObject 的属性,但为什么我不能访问动态属性? auto myObject = new MyObject(); // Contains a single
我已经搜索了几个小时,但我不知道如何从 C++ 端注册枚举类型,以便在使用 QJSEngine 时可以从脚本环境端使用它? 我有一个派生自 QObject 的类,已注册到脚本环境,并有一个以枚举作为参
我必须在 C++ 应用程序中运行一系列 javascript“脚本”。其中大部分是重复 Action 。代码示例 here . 我知道 Qt,因为第 5 版包含 2 个 javascript 引擎:Q
我从 Qt 开始,我的一个项目正在使用 QJSEngine 来评估 javascript,我想为脚本提供一个完整的 API,包括类和全局函数。 现在我的程序只提供 ECMAScript 默认的东西(e
我正在使用 QJSEngine使应用程序可编写脚本。我希望 JavaScript 端能够修改用户界面。我现在的主要问题是从 JavaScript 访问 Qt API。 为了创建小部件,我添加了一个使用
背景:我在一个需要以下内容的项目中工作:用户可以编写命令来使用主程序(用 Qt/C++ 编写的 GUI)的内部变量执行一些数学运算。 我的方法是一个文本框,用户可以在其中用 JavaScript 编写
我有一组 C++ 类在 Qt 5 中暴露给 javascript,基于 QJSEngine(因为 Qt 脚本似乎已被弃用)。 我的 QObject 派生类 A 和 B 具有 Q_OBJECT 宏并使用
我是一名优秀的程序员,十分优秀!