Я пытаюсь создать стандартную библиотеку JS, которая в основном имеет форму Qbs (в которой используется устаревшее QScriptEngine
) с QJSEngine
, поэтому люди, которые создают программное обеспечение Qt, могут добавлять такие вещи, как операции с файлами, в свою среду JS для плагинов.
Репозиторий можно посмотреть здесь
У меня есть базовые классы, открытые для движка 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, которые могут вызывать ошибки в вызывающем механизме?