QJSEngine Class
QJSEngine クラスは、JavaScript コードを評価する環境を提供します。詳細...
Header: | #include <QJSEngine> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
qmake: | QT += qml |
Inherits: | QObject |
Inherited By: |
注意:このクラスの関数はすべてリエントラントです。
パブリック型
enum | Extension { TranslationExtension, ConsoleExtension, GarbageCollectionExtension, AllExtensions } |
flags | Extensions |
enum | ObjectOwnership { CppOwnership, JavaScriptOwnership } |
プロパティ
- uiLanguage : QString
パブリック関数
QJSEngine() | |
QJSEngine(QObject *parent) | |
virtual | ~QJSEngine() override |
(since Qt 6.1) QJSValue | catchError() |
To | coerceValue(const From &from) |
void | collectGarbage() |
QJSValue | evaluate(const QString &program, const QString &fileName = QString(), int lineNumber = 1, QStringList *exceptionStackTrace = nullptr) |
T | fromManagedValue(const QJSManagedValue &value) |
T | fromPrimitiveValue(const QJSPrimitiveValue &value) |
T | fromScriptValue(const QJSValue &value) |
T | fromVariant(const QVariant &value) |
QJSValue | globalObject() const |
(since Qt 6.1) bool | hasError() const |
QJSValue | importModule(const QString &fileName) |
void | installExtensions(QJSEngine::Extensions extensions, const QJSValue &object = QJSValue()) |
bool | isInterrupted() const |
QJSValue | newArray(uint length = 0) |
QJSValue | newErrorObject(QJSValue::ErrorType errorType, const QString &message = QString()) |
QJSValue | newObject() |
QJSValue | newQMetaObject() |
QJSValue | newQMetaObject(const QMetaObject *metaObject) |
QJSValue | newQObject(QObject *object) |
(since 6.2) QJSValue | newSymbol(const QString &name) |
bool | registerModule(const QString &moduleName, const QJSValue &value) |
void | setInterrupted(bool interrupted) |
void | setUiLanguage(const QString &language) |
(since Qt 5.12) void | throwError(const QString &message) |
(since 6.1) void | throwError(const QJSValue &error) |
(since Qt 5.12) void | throwError(QJSValue::ErrorType errorType, const QString &message = QString()) |
QJSManagedValue | toManagedValue(const T &value) |
QJSPrimitiveValue | toPrimitiveValue(const T &value) |
QJSValue | toScriptValue(const T &value) |
QString | uiLanguage() const |
シグナル
void | uiLanguageChanged() |
静的パブリック・メンバー
QJSEngine::ObjectOwnership | objectOwnership(QObject *object) |
void | setObjectOwnership(QObject *object, QJSEngine::ObjectOwnership ownership) |
関連する非メンバー
QJSEngine * | qjsEngine(const QObject *object) |
詳細説明
スクリプトの評価
スクリプト・コードを評価するにはevaluate() を使用します。
evaluate() は、評価結果を保持するQJSValue を返します。QJSValue クラスには、結果をさまざまな C++ 型に変換する関数が用意されています(QJSValue::toString() やQJSValue::toNumber() など)。
次のコード・スニペットは、スクリプト関数を定義し、QJSValue::call ()を使用してC++から呼び出す方法を示しています:
QJSValue fun = myEngine.evaluate("(function(a, b) { return a + b; })"); QJSValueList args; args << 1 << 2; QJSValue threeAgain = fun.call(args);
上記のスニペットからわかるように、スクリプトは文字列の形でエンジンに提供されます。スクリプトを読み込む一般的な方法の1つは、ファイルの内容を読み込んでevaluate() に渡す方法です:
QString fileName = "helloworld.qs"; QFile scriptFile(fileName); if (!scriptFile.open(QIODevice::ReadOnly)) // handle error QTextStream stream(&scriptFile); QString contents = stream.readAll(); scriptFile.close(); myEngine.evaluate(contents, fileName);
ここでは、evaluate ()の第2引数にファイル名を渡している。第2引数は、デバッグ用にError
オブジェクトに格納される汎用文字列である。
より大規模な機能を使用する場合は、コードとデータをモジュールにカプセル化するとよいでしょう。モジュールとは、スクリプト・コードや変数などを含むファイルのことで、アプリケーションの残りの部分に対するインターフェイスを記述するためにexport文を使用します。import文の助けを借りて、モジュールは他のモジュールの機能を参照することができます。これによって、スクリプト化されたアプリケーションを、より小さなビルディングブロックから安全に構築することができます。これとは対照的に、evaluate() を使用するアプローチでは、あるevaluate() 呼び出しの内部変数や関数が誤ってグローバル・オブジェクトを汚染し、後続の評価に影響を与えるというリスクがあります。
次の例は、数値を加算するモジュールを提供するものである:
export function sum(left, right) { return left + right }
このモジュールは、math.mjs
という名前で保存されていれば、QJSEngine::import() でロードできます:
QJSvalue module = myEngine.importModule("./math.mjs"); QJSValue sumFunction = module.property("sum"); QJSValue result = sumFunction.call(args);
モジュールは、import文を使って他のモジュールの機能を使うこともできます:
import { sum } from "./math.mjs"; export function addTwice(left, right) { return sum(left, right) * 2; }
モジュールはファイルである必要はありません。モジュールはファイルである必要はありません。QJSEngine::registerModule()で登録された値でもかまいません:
import version from "version"; export function getVersion() { return version; }
QJSValue version(610); myEngine.registerModule("version", version); QJSValue module = myEngine.importModule("./myprint.mjs"); QJSValue getVersion = module.property("getVersion"); QJSValue result = getVersion.call();
名前付きエクスポートはサポートされていますが、オブジェクトのメンバーとして扱われるため、デフォルトのエクスポートは ECMAScript オブジェクトでなければなりません。QJSValue の newXYZ 関数のほとんどはオブジェクトを返します。
QJSValue name("Qt6"); QJSValue obj = myEngine.newObject(); obj.setProperty("name", name); myEngine.registerModule("info", obj);
import { name } from "info"; export function getName() { return name; }
エンジン構成
globalObject() 関数は、スクリプト・エンジンに関連付けられたグローバル・オブジェクトを返します。グローバル・オブジェクトのプロパティは、どのスクリプト・コードからもアクセス可能です(つまり、グローバル変数です)。通常、「ユーザー」スクリプトを評価する前に、グローバル・オブジェクトに 1 つ以上のプロパティを追加してスクリプト・エンジンを構成します:
myEngine.globalObject().setProperty("myNumber", 123); ... QJSValue myNumberPlusOne = myEngine.evaluate("myNumber + 1");
スクリプト環境にカスタム プロパティを追加することは、アプリケーション固有のスクリプト API を提供する標準的な手段の 1 つです。通常、これらのカスタムプロパティは、newQObject() またはnewObject() 関数によって作成されるオブジェクトです。
スクリプト例外
evaluate()関数は、スクリプトの例外を投げることができます(構文エラーなど)。その場合、evaluate() はスローされた値 (通常はError
オブジェクト) を返します。例外をチェックするには、QJSValue::isError() を使用します。
エラーの詳細については、QJSValue::toString() を使用してエラー・メッセージを取得し、QJSValue::property() を使用してError
オブジェクトのプロパティを照会します。以下のプロパティを使用できます:
name
message
fileName
lineNumber
stack
QJSValue result = myEngine.evaluate(...); if (result.isError()) qDebug() << "Uncaught exception at line" << result.property("lineNumber").toInt() << ":" << result.toString();
スクリプト・オブジェクトの作成
JavaScript オブジェクトを作成するには、newObject ()を使用します。これは C++ スクリプト文new Object()
に相当します。スクリプト・オブジェクトを操作するには、QJSValue のオブジェクト固有の機能を使用します(QJSValue::setProperty() など)。同様に、newArray() を使用して、JavaScript の配列オブジェクトを作成します。
QObject の統合
QObject (またはサブクラス) ポインタをラップするには、newQObject() を使用します。newQObject() はプロキシ・スクリプト・オブジェクトを返します。QObject のプロパティ、子オブジェクト、シグナルおよびスロットは、プロキシ・オブジェクトのプロパティとして使用できます。Qt メタオブジェクトシステムを使用して動的に行われるため、バインディングコードは必要ありません。
QPushButton *button = new QPushButton; QJSValue scriptButton = myEngine.newQObject(button); myEngine.globalObject().setProperty("button", scriptButton); myEngine.evaluate("button.checkable = true"); qDebug() << scriptButton.property("checkable").toBool(); scriptButton.property("show").call(); // call the show() slot
QMetaObject をラップするにはnewQMetaObject() を使用します。これにより、QObject ベースのクラスの「スクリプト表現」が得られます。newQMetaObject(クラスの列挙値は、プロキシオブジェクトのプロパティとして利用できます。
メタオブジェクトシステムに公開されているコンストラクタ(Q_INVOKABLE を使用)をスクリプトから呼び出して、新しいQObject インスタンスをJavaScriptOwnership で作成することができます。たとえば、次のようなクラス定義があるとします:
class MyObject : public QObject { Q_OBJECT public: Q_INVOKABLE MyObject() {} };
このクラスのstaticMetaObject
は、次のようにJavaScriptに公開できます:
QJSValue jsMetaObject = engine.newQMetaObject(&MyObject::staticMetaObject); engine.globalObject().setProperty("MyObject", jsMetaObject);
そして、そのクラスのインスタンスをJavaScriptで作成することができます:
engine.evaluate("var myObject = new MyObject()");
動的 QObject プロパティ
動的なQObject プロパティはサポートされていません。例えば、以下のコードは動作しません:
QJSEngine engine; QObject *myQObject = new QObject(); myQObject->setProperty("dynamicProperty", 3); QJSValue myScriptQObject = engine.newQObject(myQObject); engine.globalObject().setProperty("myObject", myScriptQObject); qDebug() << engine.evaluate("myObject.dynamicProperty").toInt();
拡張機能
QJSEngineはECMAScriptに準拠した実装を提供します。デフォルトでは、ロギングのようなおなじみのユーティリティは利用できませんが、installExtensions ()関数でインストールできます。
QJSValue 、アプリケーションをスクリプト化する、JavaScriptオブジェクトと関数のリストも参照してください 。
メンバ型ドキュメント
enum QJSEngine::Extension
flags QJSEngine::Extensions
この enum は、installExtensions() を介してインストールする拡張機能を指定するために使用します。
定数 | 値 | 説明 |
---|---|---|
QJSEngine::TranslationExtension | 0x1 | 翻訳関数 (qsTr() など) をインストールすることを示します。これは Qt.uiLanguage プロパティもインストールします。 |
QJSEngine::ConsoleExtension | 0x2 | コンソール関数 (console.log() など) をインストールすることを示します。 |
QJSEngine::GarbageCollectionExtension | 0x4 | ガベージコレクション機能 (gc() など) をインストールすることを示します。 |
QJSEngine::AllExtensions | 0xffffffff | すべての拡張機能をインストールすることを示します。 |
翻訳エクステンション
スクリプト翻訳関数とC++翻訳関数の関係を以下の表に示します:
スクリプト関数 | 対応する C++ 関数 |
---|---|
qsTr() | QObject::tr() |
QT_TR_NOOP() | QT_TR_NOOP() |
qsTranslate() | QCoreApplication::translate() |
QT_TRANSLATE_NOOP() | QT_TRANSLATE_NOOP() |
qsTrId() | qtTrId() |
QT_TRID_NOOP() | QT_TRID_NOOP() |
このフラグは、文字列プロトタイプにarg()
関数も追加します。
詳細については、Internationalization with Qtドキュメントを参照してください。
ConsoleExtension
consoleオブジェクトは、Console API のサブセットを実装し、console.log()
のようなおなじみのロギング関数を提供します。
追加された関数のリストは以下の通りです:
console.assert()
console.debug()
console.exception()
console.info()
console.log()
( と同等)console.debug()
console.error()
console.time()
console.timeEnd()
console.trace()
console.count()
console.warn()
print()
( と同等)console.debug()
詳細については、Console API のドキュメントを参照してください。
GarbageCollectionExtension
gc()
関数はcollectGarbage() を呼び出すのと同じです。
Extensions 型はQFlags<Extension> の typedef です。これは、Extension 値の OR の組み合わせを格納します。
enum QJSEngine::ObjectOwnership
ObjectOwnership は、対応する JavaScript オブジェクトがエンジンによってガベージコレクションされるときに、JavaScript メモリマネージャがQObject を自動的に破棄するかどうかを制御します。所有権のオプションは 2 つあります:
定数 | 値 | 説明 |
---|---|---|
QJSEngine::CppOwnership | 0 | オブジェクトは C++ コードによって所有され、JavaScript メモリ マネージャは決して削除しません。JavaScript の destroy() メソッドはこれらのオブジェクトでは使用できません。このオプションは QScriptEngine::QtOwnership に似ています。 |
QJSEngine::JavaScriptOwnership | 1 | オブジェクトはJavaScriptによって所有されます。オブジェクトがメソッド呼び出しの戻り値として JavaScript メモリマネージャに返されると、JavaScript メモリマネージャはそのオブジェクトを追跡し、そのオブジェクトへの JavaScript 参照が残っておらず、QObject::parent() がない場合は削除します。あるQJSEngine によって追跡されたオブジェクトは、そのQJSEngine のデストラクタの間に削除されます。したがって、2 つの異なるエンジンの JavaScriptOwnership を持つオブジェクト間の JavaScript 参照は、これらのエンジンの 1 つが削除されると無効になります。このオプションは QScriptEngine::ScriptOwnership に似ています。 |
通常、アプリケーションはオブジェクトの所有権を明示的に設定する必要はありません。JavaScriptのメモリマネージャは、ヒューリスティックな方法でデフォルトの所有権を設定します。デフォルトでは、JavaScriptメモリマネージャによって作成されたオブジェクトはJavaScriptOwnershipを持ちます。この例外は、QQmlComponent::create() またはQQmlComponent::beginCreate() を呼び出して作成されるルートオブジェクトで、デフォルトでは CppOwnership を持っています。これらのルートレベルオブジェクトの所有権は、C++呼び出し元に移ったとみなされます。
JavaScript メモリ マネージャによって作成されないオブジェクトは、デフォルトで CppOwnership を持っています。例外は C++ メソッド呼び出しから返されるオブジェクトで、その所有権は JavaScriptOwnership に設定されます。これはQ_INVOKABLE メソッドまたはスロットの明示的な呼び出しにのみ適用され、プロパティゲッターの呼び出しには適用されません。
setObjectOwnership() を呼び出すと、デフォルトの所有権が上書きされます。
データの所有権」も参照してください 。
プロパティ文書
uiLanguage : QString
このプロパティは、ユーザ・インタフェースの文字列の翻訳に使用する言語を保持します。
このプロパティは、ユーザインタフェース文字列の翻訳に使用される言語の名前を保持する。このプロパティは、QJSEngine::TranslationExtension がエンジンにインストールされているときに、Qt.uiLanguage
として読み書きのために公開されます。QQmlEngine のインスタンスでは常に公開されます。
この値は自由に設定でき、バインディングで使用できます。アプリケーションにトランスレータをインストールした後に設定することをお勧めします。慣習上、空文字列はソースコードで使用されている言語からの翻訳が意図されていないことを意味します。
アクセス関数
QString | uiLanguage() const |
void | setUiLanguage(const QString &language) |
通知シグナル
void | uiLanguageChanged() |
メンバ関数ドキュメント
QJSEngine::QJSEngine()
QJSEngine オブジェクトを構築します。
globalObject() は、ECMA-262 のセクション 15.1 に記述されているプロパティを持つように初期化される。
[explicit]
QJSEngine::QJSEngine(QObject *parent)
指定されたparent を持つ QJSEngine オブジェクトを構築します。
globalObject() は、ECMA-262 のセクション 15.1 に記述されているプロパティを持つように初期化されます。
[override virtual noexcept]
QJSEngine::~QJSEngine()
このQJSEngine を破棄します。
QJSEngine の破棄中は、永続 JS ヒープからゴミは収集されません。すべてのメモリを解放する必要がある場合は、QJSEngine を破棄する直前にcollectGarbage() を手動で呼び出します。
[since Qt 6.1]
QJSValue QJSEngine::catchError()
現在保留中の例外がある場合は、それをキャッチし、QJSValue として返します。それ以外の場合は、QJSValue として未定義を返します。このメソッドを呼び出した後、hasError() はfalse
を返します。
この関数は Qt 6.1 で導入されました。
template <typename From, typename To> To QJSEngine::coerceValue(const From &from)
与えられたfrom をテンプレート型To
に変換して返します。変換は JavaScript のセマンティクスで行われます。これらはqvariant_cast のセマンティクスとは異なります。デフォルトではqvariant_cast によって実行されない、JavaScript と同等の型間の暗黙の変換が多数あります。このメソッドは、このクラスの他のすべての変換メソッドの一般化です。
fromVariant(),qvariant_cast(),fromScriptValue(),toScriptValue()も参照してください 。
void QJSEngine::collectGarbage()
ガベージ・コレクタを実行します。
ガベージ・コレクタは、スクリプト環境で到達できなくなったオブジェクトを探し出し、廃棄することで、メモリの再利用を試みます。
通常、この関数を呼び出す必要はありません。ガベージコレクタは、QJSEngine がそうするのが賢明だと判断したとき(つまり、一定数の新しいオブジェクトが作成されたとき)に自動的に呼び出されます。しかし、この関数を呼び出して、できるだけ早くガベージコレクションを実行するよう明示的に要求することもできます。
ガベージ・コレクションおよびgc()も参照して ください。
QJSValue QJSEngine::evaluate(const QString &program, const QString &fileName = QString(), int lineNumber = 1, QStringList *exceptionStackTrace = nullptr)
lineNumber を基準行番号としてprogram を評価し、評価結果を返します。
スクリプト・コードは、グローバル・オブジェクトのコンテキストで評価されます。
注意: QML コンテキスト内で評価する必要がある場合は、代わりにQQmlExpression を使用してください。
program を評価すると、エンジン内でexception が発生することがあります。この場合、返り値はスローされた例外(通常はError
オブジェクト。QJSValue::isError() を参照)になります。
lineNumber は、 の開始行番号を指定するために使用されます。この評価に関連してエンジンから報告される行番号情報は、この引数に基づいています。たとえば、 が2行のコードで構成され、2行目のステートメントでスクリプト例外が発生した場合、例外行番号は に1を足したものになります。開始行番号が指定されない場合、行番号は1ベースとなる。program program lineNumber
fileName はエラー報告に使用されます。例えば、この関数でファイル名を指定すると、エラーオブジェクトの "fileName" プロパティからファイル名にアクセスできるようになります。
exceptionStackTrace は、捕捉されない例外が発生したかどうかを報告するために使用されます。この関数に への NULL 以外のポインタを渡すと、スクリプトが未処理の例外をスローした場合は「スタックフレームメッセージ」のリストが設定され、そうでない場合は空のリストが設定されます。スタックフレームメッセージの書式は、関数名:行番号:列:ファイル名です。QStringList
注意 : ネイティブ関数の場合など、関数名とファイル名が空であったり、行番号と列が -1 であったりすることがあります。
注意: 例外が発生し、例外値がErrorインスタンスでない場合(すなわち、QJSValue::isError() がfalse
を返す場合)も、例外値が返されます。その値が通常の戻り値なのか例外的な戻り値なのかを区別するには、exceptionStackTrace->isEmpty()
を使用してください。
QQmlExpression::evaluateも参照してください 。
template <typename T> T QJSEngine::fromManagedValue(const QJSManagedValue &value)
与えられたvalue をテンプレート型T
に変換して返します。
toManagedValue() およびcoerceValue() も参照 。
template <typename T> T QJSEngine::fromPrimitiveValue(const QJSPrimitiveValue &value)
与えられたvalue をテンプレート型T
に変換して返します。
QJSPrimitiveValue は int、bool、double、QString 、および JavaScript のnull
とundefined
に相当するものしか保持できないので、それ以外の型を要求した場合、値は積極的に強制されます。
toPrimitiveValue() およびcoerceValue()も参照 。
template <typename T> T QJSEngine::fromScriptValue(const QJSValue &value)
与えられたvalue をテンプレート型T
に変換して返します。
toScriptValue() およびcoerceValue() も参照 。
template <typename T> T QJSEngine::fromVariant(const QVariant &value)
与えられたvalue をテンプレート型T
に変換して返します。変換はJavaScriptのセマンティクスで行われます。これらはqvariant_cast のセマンティクスとは異なります。JavaScriptと等価な型間の暗黙の変換がいくつかあり、デフォルトではqvariant_cast では実行されません。
coerceValue(),fromScriptValue(),qvariant_cast()も参照してください 。
QJSValue QJSEngine::globalObject() const
このエンジンのグローバル・オブジェクトを返します。
デフ ォル ト では、 グローバル オブジ ェ ク ト には、 Math ・ Date ・ String と いっ たECMA-262 の一部であ る 組み込みオブジ ェ ク ト が含まれてい ます。さらに、グローバル・オブジェクトのプロパティを設定して、独自の拡張をすべてのスクリプト・コードで使用できるようにすることもできます。スクリプトコード内の非ローカル変数は、グローバルコード内のローカル変数と同様に、グローバルオブジェクトのプロパティとして作成されます。
[since Qt 6.1]
bool QJSEngine::hasError() const
最後の JavaScript 実行で例外が発生した場合、またはthrowError() が呼び出された場合はtrue
を返します。そうでない場合はfalse
を返します。evaluate() は、評価されたコードでスローされた例外をキャッチします。
この関数は Qt 6.1 で導入されました。
QJSValue QJSEngine::importModule(const QString &fileName)
fileName にあるモジュールをインポートし、すべてのエクスポートされた変数、定数、関数をプロパティとして含むモジュール名前空間オブジェクトを返します。
エンジンでモジュールが初めてインポートされる場合、ファイルはローカルファイルシステムまたは Qt リソースシステムの指定された場所からロードされ、ECMAScript モジュールとして評価されます。ファイルは UTF-8 テキストでエンコードされます。
同じモジュールを続けてインポートすると、前にインポートしたインスタンスが返されます。モジュールはシングルトンであり、エンジンが破棄されるまで残ります。
指定されたfileName は、内部的にQFileInfo::canonicalFilePath() を使って正規化されます。つまり、ディスク上の同じファイルを異なる相対パスで複数回インポートしても、ファイルは1回しかロードされません。
注意: モジュールのロード中に例外が発生した場合、戻り値はその例外となります (通常はError
オブジェクトです。QJSValue::isError() を参照してください)。
registerModule()も参照 。
void QJSEngine::installExtensions(QJSEngine::Extensions extensions, const QJSValue &object = QJSValue())
標準の ECMAScript 実装では利用できない機能を追加するために、JavaScriptextensions をインストールします。
拡張機能は、指定されたobject にインストールされ、オブジェクトが指定されていない場合はGlobal Object にインストールされます。
列挙値をOR
- することで、複数の拡張を一度にインストールすることができます:
Extensionも参照 。
bool QJSEngine::isInterrupted() const
JavaScript の実行が現在中断されているかどうかを返します。
setInterrupted()も参照して ください。
QJSValue QJSEngine::newArray(uint length = 0)
指定されたlength で Array クラスの JavaScript オブジェクトを作成します。
newObject() も参照して ください。
QJSValue QJSEngine::newErrorObject(QJSValue::ErrorType errorType, const QString &message = QString())
エラーメッセージとしてmessage を指定して、Error クラスの JavaScript オブジェクトを作成します。
作成されたオブジェクトのプロトタイプはerrorType になります。
newObject()、throwError()、QJSValue::isError() も参照 。
QJSValue QJSEngine::newObject()
Object クラスの JavaScript オブジェクトを作成します。
作成されたオブジェクトのプロトタイプは、Object プロトタイプ・オブジェクトになります。
newArray() およびQJSValue::setProperty() も参照して ください。
template <typename T> QJSValue QJSEngine::newQMetaObject()
クラスT
に関連付けられた staticQMetaObject をラップする JavaScript オブジェクトを作成します。
newQObject() およびQObject Integration も参照して ください。
QJSValue QJSEngine::newQMetaObject(const QMetaObject *metaObject)
指定されたQMetaObject をラップする JavaScript オブジェクトを作成します。metaObject は、スクリプト・エンジンよりも長生きしなければなりません。このメソッドは、静的メタオブジェクトでのみ使用することをお勧めします。
コンストラクタとして呼び出されると、クラスの新しいインスタンスが作成されます。スクリプトエンジンから見えるのは、Q_INVOKABLE によって公開されたコンストラクタだけです。
newQObject() およびQObject Integrationも参照してください 。
QJSValue QJSEngine::newQObject(QObject *object)
与えられたQObject object をラップする JavaScript オブジェクトを、JavaScriptOwnership を使って作成します。
object のシグナル と ス ロ ッ ト 、 プ ロ パテ ィ と 子プ ロ パテ ィ は、 作成 さ れたQJSValue のプ ロ パテ ィ と し て利用可能です。
object が NULL ポインタの場合、この関数は NULL 値を返します。
object のクラス(または再帰的にそのスーパークラス)にデフォルトのプロトタイプが登録されている場合、新しいスクリプトオブジェクトのプロトタイプはそのデフォルトのプロトタイプに設定されます。
指定 さ れたobject がエン ジ ンの制御外で削除 さ れた場合、 JavaScript ラ ッ パオブジ ェ ク ト を通 じ て削除 さ れたQObject の メ ンバにア ク セ ス し よ う と す る と (ス ク リ プ ト コ ー ド で も C++ で も)、script exception にな り ます。
QJSValue::toQObject()も参照して ください。
[since 6.2]
QJSValue QJSEngine::newSymbol(const QString &name)
値name を持つ Symbol クラスの JavaScript オブジェクトを作成します。
作成されたオブジェクトのプロトタイプは Symbol プロトタイプオブジェクトになります。
この関数は Qt 6.2 で導入されました。
newObject()も参照してください 。
[static]
QJSEngine::ObjectOwnership QJSEngine::objectOwnership(QObject *object)
object の所有権を返します。
setObjectOwnership() およびQJSEngine::ObjectOwnershipも参照のこと 。
bool QJSEngine::registerModule(const QString &moduleName, const QJSValue &value)
QJSValue をモジュールとして登録する。この関数が呼ばれた後、moduleName をインポートするすべてのモジュールは、ファイルシステムからmoduleName をロードする代わりに、value の値をインポートします。
有効なQJSValue ならどれでも登録できますが、名前付きエクスポート(すなわちimport { name } from "info"
)はオブジェクトのメンバーとして扱われるため、デフォルトのエクスポートはQJSEngine の newXYZ メソッドのいずれかで作成する必要があります。
これにより、ファイルシステム上に存在しないモジュールをインポートできるため、スクリプト・アプリケーションはこれを使用して、Node.jsのような組み込みモジュールを提供できる。
成功すればtrue
を、そうでなければfalse
を返す。
注意: QJSValue value は、他のモジュールによって使用されるまで、呼び出されることも読み込まれることもない。つまり、評価するコードがないので、他のモジュールがこのモジュールをロードしようとして例外を投げるまで、エラーは発生しません。
importModule()も参照のこと 。
void QJSEngine::setInterrupted(bool interrupted)
JavaScript の実行を中断または再有効化します。
interrupted がtrue
の場合、このエンジンによって実行された JavaScript は、この関数がfalse
の値interrupted で再度呼び出されるまで、直ちに中断され、エラーオブジェクトを返します。
この関数はスレッドセーフです。たとえば、JavaScript の無限ループを中断するために、別のスレッドからこの関数を呼び出すことができます。
isInterrupted()も参照 。
[static]
void QJSEngine::setObjectOwnership(QObject *object, QJSEngine::ObjectOwnership ownership)
object のownership を設定します。
JavaScriptOwnership
を持つオブジェクトは、たとえそのオブジェクトへの参照がなくても、親が存在する限りガベージコレクションされません。
objectOwnership() およびQJSEngine::ObjectOwnershipも参照 。
[since Qt 5.12]
void QJSEngine::throwError(const QString &message)
与えられたmessage でランタイム・エラー(例外)をスローします。
このメソッドは、JavaScript のthrow()
式に対応する C++ メソッドです。こ れに よ り 、 C++ コ ー ド は実行時エ ラ ーをQJSEngine に報告で き る よ う にな り ます。 こ のため、 こ の メ ソ ッ ド は、 JavaScript 関数か らQJSEngine を通 じ て呼び出 さ れた C++ コ ー ド か ら のみ呼び出す必要があ り ます。
C++ から戻るとき、エンジンは通常の実行フローを中断し、あらかじめ登録された次の例外ハンドラを、指定されたmessage を含むエラー・オブジェクトとともに呼び出します。エラー・オブジェクトは、JavaScriptの呼び出し側スタックの最上位コンテキストの場所を指します。具体的には、lineNumber
、fileName
、stack
のプロパティを持ちます。これらのプロパティはScript Exceptions で説明されています。
以下の例では、FileAccess.cppのC++メソッドが、readFileAsText()
が呼び出された位置のqmlFile.qmlでエラーをスローしています:
// qmlFile.qml function someFunction() { ... var text = FileAccess.readFileAsText("/path/to/file.txt"); }
// FileAccess.cpp // Assuming that FileAccess is a QObject-derived class that has been // registered as a singleton type and provides an invokable method // readFileAsText() QJSValue FileAccess::readFileAsText(const QString & filePath) { QFile file(filePath); if (!file.open(QIODevice::ReadOnly)) { jsEngine->throwError(file.errorString()); return QString(); } ... return content; }
スローされたエラーをJavaScriptでキャッチすることも可能です:
// qmlFile.qml function someFunction() { ... var text; try { text = FileAccess.readFileAsText("/path/to/file.txt"); } catch (error) { console.warn("In " + error.fileName + ":" + "error.lineNumber" + ": " + error.message); } }
例外を記述するために、より具体的なランタイムエラーが必要な場合、throwError(QJSValue::ErrorType errorType, const QString &message)オーバーロードを使用することができます。
この関数はQt 5.12で導入されました。
Script Exceptionsも参照してください 。
[since 6.1]
void QJSEngine::throwError(const QJSValue &error)
この関数は throwError() をオーバーロードします。
事前に構成されたランタイムerror (例外)をスローします。これにより、newErrorObject() を使用してエラーを作成し、必要に応じてカスタマイズすることができます。
この関数は Qt 6.1 で導入されました。
Script Exceptions とnewErrorObject()も参照してください 。
[since Qt 5.12]
void QJSEngine::throwError(QJSValue::ErrorType errorType, const QString &message = QString())
この関数は throwError() をオーバーロードします。
与えられたerrorType とmessage でランタイムエラー(例外)をスローします。
// Assuming that DataEntry is a QObject-derived class that has been // registered as a singleton type and provides an invokable method // setAge(). void DataEntry::setAge(int age) { if (age < 0 || age > 200) { jsEngine->throwError(QJSValue::RangeError, "Age must be between 0 and 200"); } ... }
この関数は Qt 5.12 で導入されました。
Script Exceptions およびnewErrorObject()も参照してください 。
template <typename T> QJSManagedValue QJSEngine::toManagedValue(const T &value)
与えられたvalue でQJSManagedValue を作成します。
fromManagedValue() およびcoerceValue() も参照して ください。
template <typename T> QJSPrimitiveValue QJSEngine::toPrimitiveValue(const T &value)
与えられたvalue でQJSPrimitiveValue を作成します。
QJSPrimitiveValue が保持できるのは int、bool、double、QString 、および JavaScript のnull
とundefined
に相当するものだけなので、それ以外の型を渡すと、値は積極的に強制されます。
fromPrimitiveValue() およびcoerceValue()も参照 。
template <typename T> QJSValue QJSEngine::toScriptValue(const T &value)
与えられたvalue を持つQJSValue を作成します。
fromScriptValue() およびcoerceValue()も参照 ください。
関連する非会員
QJSEngine *qjsEngine(const QObject *object)
object に関連するQJSEngine があればそれを返します。
この関数は、QObject を JavaScript 環境に公開し、プログラムの後半でアクセスを再開したい場合に便利です。QJSEngine::newQObject() から返されたラッパーを保持する必要はありません。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。