QJSEngine Class
QJSEngine クラスは、JavaScript コードを評価するための環境を提供します。詳細...
| ヘッダー: | #include <QJSEngine> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
| qmake: | QT += qml |
| 継承元: | QObject |
| 継承元: |
注:このクラスのすべての関数は再入可能である。
パブリック型
| 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);上記のスニペットからわかるように、スクリプトは文字列の形式でエンジンに提供されます。スクリプトを読み込む一般的な方法の一つは、ファイルの内容を読み込んで、それを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を提供するための標準的な手段の一つです。通常、これらのカスタムプロパティは、newQObject() またはnewObject() 関数によって作成されたオブジェクトです。
スクリプト例外
evaluate() は(構文エラーなどにより)スクリプト例外をスローすることがあります。その場合、evaluate() はスローされた値(通常はError オブジェクト)を返します。例外の有無を確認するには、QJSValue::isError() を使用してください。
エラーの詳細については、QJSValue::toString() を使用してエラーメッセージを取得し、QJSValue::property() を使用してError オブジェクトのプロパティを照会してください。以下のプロパティが利用可能です:
namemessagefileNamelineNumberstack
QJSValue result=myEngine.evaluate(...);
if(result.isError())
qDebug()
<< "行" で未処理の例外が発生しました
<<result.property("lineNumber").toInt()
<< ":" <<result.toString();スクリプトオブジェクトの作成
newObject() を使用して JavaScript オブジェクトを作成します。これは、C++ における script 文new Object() に相当します。QJSValue に記載されているオブジェクト固有の機能を使用して、スクリプトオブジェクトを操作できます(例:QJSValue::setProperty())。同様に、newArray() を使用して JavaScript 配列オブジェクトを作成します。
QObject との統合
newQObject() を使用して、QObject (またはそのサブクラス)のポインタをラップします。newQObject() はプロキシスクリプトオブジェクトを返します。QObject のプロパティ、子、シグナルおよびスロットは、プロキシオブジェクトのプロパティとして利用可能です。Qt メタオブジェクトシステムを使用して動的に処理されるため、バインディングコードは必要ありません。
QPushButton*button = newQPushButton;
QJSValue scriptButton=myEngine.newQObject(button);
myEngine.globalObject().setProperty("button",scriptButton);
myEngine.evaluate("button.checkable = true");
qDebug() << scriptButton.property("checkable").toBool();
scriptButton.property("show").call();// show()スロットを呼び出すnewQMetaObject() を使用して、QMetaObject をラップします。これにより、QObject ベースのクラスの「スクリプト表現」が得られます。newQMetaObject() はプロキシスクリプトオブジェクトを返します。クラスの列挙値は、プロキシオブジェクトのプロパティとして利用可能です。
メタオブジェクトシステムに公開されたコンストラクタ(Q_INVOKABLE を使用)は、スクリプトから呼び出して、JavaScriptOwnership を持つ新しいQObject インスタンスを作成できます。たとえば、次のようなクラス定義がある場合:
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 = newQObject();
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
この列挙型は、installExtensions() を通じてインストールする拡張機能を指定するために使用されます。
| 定数 | 定数名 | 説明 |
|---|---|---|
QJSEngine::TranslationExtension | 0x1 | 翻訳関数(qsTr() など)をインストールする必要があることを示します。これにより、Qt.uiLanguage プロパティもインストールされます。 |
QJSEngine::ConsoleExtension | 0x2 | コンソール関数(console.log() など)をインストールすることを示します。 |
QJSEngine::GarbageCollectionExtension | 0x4 | ガベージコレクション関数(gc() など)をインストールする必要があることを示します。 |
QJSEngine::AllExtensions | 0xffffffff | すべての拡張機能をインストールすることを指定します。 |
TranslationExtension
スクリプトの翻訳関数と 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() ` 関数が追加されます。
詳細については、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 つです。
| Constant | 値 | 説明 |
|---|---|---|
QJSEngine::CppOwnership | 0 | オブジェクトは C++ コードによって所有されており、JavaScript メモリマネージャーはこれを決して削除しません。これらのオブジェクトに対しては、JavaScript の destroy() メソッドを使用することはできません。このオプションは QScriptEngine::QtOwnership に類似しています。 |
QJSEngine::JavaScriptOwnership | 1 | オブジェクトは JavaScript によって所有されます。メソッド呼び出しの戻り値としてオブジェクトが JavaScript メモリマネージャーに返されると、JavaScript メモリマネージャーはそれを追跡し、そのオブジェクトへの JavaScript 参照が残っておらず、かつ `QObject::parent()` が呼び出されていない場合に削除します。 1つのQJSEngine によって追跡されているオブジェクトは、そのQJSEngine のデストラクタが実行される際に破棄されます。したがって、2つの異なるエンジンからJavaScriptOwnershipを持つオブジェクト間のJavaScript参照は、それらのエンジンのいずれかが破棄された場合、無効になります。このオプションは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) |
Notifierシグナル:
| 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 のセマンティクスとは異なります。JavaScriptで同等の型間には多くの暗黙的な変換が存在しますが、qvariant_cast ではデフォルトではこれらが実行されません。このメソッドは、このクラス内の他のすべての変換メソッドを一般化したものです。
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)
`program` を、`lineNumber ` を基数として評価し、その評価結果を返します。
スクリプトコードは、グローバルオブジェクトのコンテキストで評価されます。
注: QML コンテキスト内で評価する必要がある場合は 、代わりに `QQmlExpression ` を使用してください。
program の評価により、エンジンでexception が発生する場合があります。この場合、戻り値はスローされた例外(通常はError オブジェクト)になります。QJSValue::isError() を参照してください。
lineNumber は、program の開始行番号を指定するために使用されます。この評価に関連してエンジンから報告される行番号情報は、この引数に基づいて決定されます。 たとえば、program が2行のコードで構成されており、2行目のステートメントがスクリプト例外を引き起こした場合、例外の行番号はlineNumber に1を加えた値になります。開始行番号が指定されていない場合、行番号は1から始まります。
fileName はエラー報告に使用されます。例えば、エラーオブジェクトでは、この関数でファイル名が指定されている場合、そのファイル名は「fileName」プロパティを通じてアクセス可能です。
exceptionStackTrace は、未処理の例外がスローされたかどうかを報告するために使用されます。QStringList にnullでないポインタを渡すと、スクリプトが未処理の例外をスローした場合は「スタックフレームメッセージ」のリストに設定され、そうでない場合は空のリストに設定されます。スタックフレームメッセージの形式は、関数名:行番号:列:ファイル名です。
注:場合によっては( 例えばネイティブ関数など)、関数名やファイル名が空であったり、行番号や列が-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実装では利用できない機能を追加するために、JavaScriptのextensions をインストールします。
拡張機能は、指定された `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` に関連付けられた静的 `QMetaObject ` をラップする JavaScript オブジェクトを作成します。
newQObject() およびQObject Integrationも参照してください 。
QJSValue QJSEngine::newQMetaObject(const QMetaObject *metaObject)
指定されたQMetaObject をラップするJavaScriptオブジェクトを作成します。metaObject は、スクリプトエンジンよりも長く存続する必要があります。このメソッドは、静的なメタオブジェクトに対してのみ使用することを推奨します。
コンストラクタとして呼び出されると、クラスの新しいインスタンスが作成されます。スクリプトエンジンからは、Q_INVOKABLE によって公開されたコンストラクタのみが参照可能です。
newQObject() およびQObject Integrationも参照してください 。
QJSValue QJSEngine::newQObject(QObject *object)
JavaScriptOwnership を使用して、指定された `QObject ` `object` をラップする JavaScript オブジェクトを作成します。
object のシグナル、スロット、プロパティ、および子要素は、作成されたQJSValue のプロパティとして利用可能です。
object がヌルポインタの場合、この関数はヌル値を返します。object が削除予定になっている場合や、そのデストラクタがすでに実行中の場合も同様です。
object のクラス(またはそのスーパークラス、再帰的に)に対してデフォルトのプロトタイプが登録されている場合、新しいスクリプトオブジェクトのプロトタイプはそのデフォルトのプロトタイプに設定されます。
指定されたobject がエンジンの制御外で削除された場合、JavaScriptラッパーオブジェクトを介して(スクリプトコードまたはC++のいずれかによって)削除されたQObject のメンバにアクセスしようとすると、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 は 、別のモジュールによって使用されるまで呼び出されたり読み取られたりすることはありません。つまり、評価されるコードが存在しないため、別のモジュールがこのモジュールをロードしようとして例外をスローするまでは、エラーは発生しません。
警告: モジュールが登録されると 、エンジンはvalue のプロパティを評価してスナップショットをとり、何がエクスポートされるかを決定します。 ラップされた `QObject` の場合、これはそのプロパティが一度だけ読み込まれることを意味し、その後のプロパティの変更は JavaScript からアクセスした際に反映されません。モジュール登録後に値が変更されるプロパティを持つ `QObject ` がある場合は、`QObject ` を直接登録しないでください。代わりに、別のオブジェクトでラップしてください:
// C++ setup
QJSValue container = engine.newObject();
container.setProperty("instance", engine.newQObject(&myDynamicObject));
engine.registerModule("api.mjs", container);
// JavaScript usage
import {instance as Api} from "api.mjs"
// ...
console.log(Api.dynamicProperty)importModule()も参照してください 。
void QJSEngine::setInterrupted(bool interrupted)
JavaScriptの実行を中断または再開します。
interrupted がtrue の場合、このエンジンによって実行中のJavaScriptは直ちに中止され、interrupted の値としてfalse が指定されてこの関数が再度呼び出されるまで、エラーオブジェクトを返します。
この関数はスレッドセーフです。たとえば、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++ メソッドが、qmlFile.qml内のreadFileAsText() が呼び出される位置でエラーをスローします:
// 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)
あらかじめ作成されたランタイムのerror (例外)をスローします。これにより、newErrorObject() を使用してエラーを作成し、必要に応じてカスタマイズすることができます。
この関数は、QJSEngine::throwError() をオーバーロードしています。
この関数は Qt 6.1 で導入されました。
「 Script Exceptions 」および「newErrorObject()」も参照してください 。
[since Qt 5.12] void QJSEngine::throwError(QJSValue::ErrorType errorType, const QString &message = QString())
指定された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");
}
...
}この関数は、QJSEngine::throwError() をオーバーロードしています。
この関数は 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()から返されたラッパーを保持しておく必要はありません。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.