이 페이지에서

QJSEngine Class

QJSEngine 클래스는 자바스크립트 코드를 실행해 볼 수 있는 환경을 제공합니다. 더 보기...

헤더: #include <QJSEngine>
CMake: find_package(Qt6 REQUIRED COMPONENTS Qml)
target_link_libraries(mytarget PRIVATE Qt6::Qml)
qmake: QT += qml
상속: QObject
상속받는 클래스:

QQmlEngine

참고: 이 클래스의 모든 함수는 재진입 가능합니다.

공개 유형

enum Extension { TranslationExtension, ConsoleExtension, GarbageCollectionExtension, AllExtensions }
flags Extensions
enum ObjectOwnership { CppOwnership, JavaScriptOwnership }

속성

공개 함수

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

신호

정적 공용 멤버

QJSEngine::ObjectOwnership objectOwnership(QObject *object)
void setObjectOwnership(QObject *object, QJSEngine::ObjectOwnership ownership)
QJSEngine *qjsEngine(const QObject *object)

상세 설명

스크립트 평가

evaluate()를 사용하여 스크립트 코드를 실행합니다.

QJSEngine myEngine;
QJSValue three = myEngine.evaluate("1 + 2");

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()`의 두 번째 인수로 전달합니다. 이는 평가에 어떠한 영향도 미치지 않으며, 두 번째 인수는 디버깅을 위해 ` 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() 함수는 스크립트 엔진과 연결된 전역 객체를 반환합니다. 전역 객체의 속성은 모든 스크립트 코드에서 접근할 수 있습니다(즉, 전역 변수입니다). 일반적으로 "사용자" 스크립트를 평가하기 전에 전역 객체에 하나 이상의 속성을 추가하여 스크립트 엔진을 구성해야 합니다:

myEngine.globalObject().setProperty("myNumber", 123);
...
QJSValue myNumberPlusOne = myEngine.evaluate("myNumber + 1");

스크립팅 환경에 사용자 정의 속성을 추가하는 것은 애플리케이션에 특화된 스크립팅 API를 제공하는 표준적인 방법 중 하나입니다. 일반적으로 이러한 사용자 정의 속성은 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()
           << "라인에서 처리되지 않은 예외 발생"
            << 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 = 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(); // 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()");

참고: 현재는 Q_OBJECT 매크로를 사용하는 클래스만 지원되며, Q_GADGET 클래스의 staticMetaObject 를 JavaScript에 노출할 수는 없습니다.

동적 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, 애플리케이션 스크립트화, 자바스크립트 객체 및 함수 목록도 참조하십시오 .

멤버 유형 문서

enum QJSEngine::Extension
flags QJSEngine::Extensions

이 열거형은 installExtensions()를 통해 설치할 확장 프로그램을 지정하는 데 사용됩니다.

상수값설명
QJSEngine::TranslationExtension0x1번역 함수(예:qsTr())를 설치해야 함을 나타냅니다. 또한 Qt.uiLanguage 속성도 함께 설치됩니다.
QJSEngine::ConsoleExtension0x2콘솔 함수(예:console.log())를 설치해야 함을 나타냅니다.
QJSEngine::GarbageCollectionExtension0x4가비지 컬렉션 함수(예:gc())를 설치해야 함을 나타냅니다.
QJSEngine::AllExtensions0xffffffff모든 확장 기능을 설치해야 함을 나타냅니다.

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은 해당 자바스크립트 객체가 엔진에 의해 가비지 컬렉션될 때, 자바스크립트 메모리 관리자가 QObject 를 자동으로 파기할지 여부를 제어합니다. 소유권 옵션은 다음 두 가지입니다:

Constant값설명
QJSEngine::CppOwnership0객체는 C++ 코드가 소유하며, 자바스크립트 메모리 관리자는 이 객체를 절대 삭제하지 않습니다. 이러한 객체에는 자바스크립트 destroy() 메서드를 사용할 수 없습니다. 이 옵션은 QScriptEngine::QtOwnership과 유사합니다.
QJSEngine::JavaScriptOwnership1객체는 JavaScript가 소유합니다. 메서드 호출의 반환 값으로 객체가 JavaScript 메모리 관리자에게 반환되면, JavaScript 메모리 관리자는 해당 객체를 추적하며, 해당 객체에 대한 JavaScript 참조가 남아 있지 않고 QObject::parent()가 없는 경우 이를 삭제합니다. 하나의 ` QJSEngine `에 의해 추적되는 객체는 해당 ` QJSEngine`의 소멸자 실행 중에 삭제됩니다. 따라서 서로 다른 두 엔진의 `JavaScriptOwnership`을 가진 객체 간의 JavaScript 참조는, 해당 엔진 중 하나가 삭제될 경우 유효하지 않게 됩니다. 이 옵션은 `QScriptEngine::ScriptOwnership`과 유사합니다.

일반적으로 애플리케이션은 객체의 소유권을 명시적으로 설정할 필요가 없습니다. 자바스크립트 메모리 관리자는 휴리스틱을 사용하여 기본 소유권을 설정합니다. 기본적으로 자바스크립트 메모리 관리자에 의해 생성된 객체는 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`로 `undefined`를 반환합니다. 이 메서드를 호출한 후 ` hasError()`는 ` false`를 반환합니다.

이 함수는 Qt 6.1에서 도입되었습니다.

template <typename From, typename To> To QJSEngine::coerceValue(const From &from)

주어진 ` from `를 템플릿 유형 ` To`로 변환하여 반환합니다. 변환은 자바스크립트 의미 체계에 따라 수행됩니다. 이는 qvariant_cast 의 의미 체계와는 다릅니다. 자바스크립트 상응 유형 간에는 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)

lineNumber 를 기준 번호로 사용하여 ` program`을 평가하고, 평가 결과를 반환합니다.

스크립트 코드는 전역 객체의 컨텍스트에서 평가됩니다.

참고: QML 컨텍스트 내에서 평가해야 하는경우 , 대신 ` QQmlExpression `를 사용하십시오.

program 의 평가는 엔진에서 exception 을 발생시킬 수 있습니다. 이 경우 반환 값은 던져진 예외(일반적으로 Error 객체)가 됩니다( QJSValue::isError() 참조).

lineNumber 는 program 의 시작 줄 번호를 지정하는 데 사용됩니다. 이 평가와 관련하여 엔진에서 보고하는 줄 번호 정보는 이 인수를 기준으로 합니다. 예를 들어, ` program `이 두 줄의 코드로 구성되어 있고 두 번째 줄의 문장이 스크립트 예외를 유발하는 경우, 예외 줄 번호는 ` 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`로 변환한 결과를 반환합니다. 변환은 자바스크립트 의미 체계에 따라 수행됩니다. 이는 ` qvariant_cast`의 의미 체계와는 다릅니다. 자바스크립트와 동등한 유형 간에는 여러 암시적 변환이 존재하지만, ` qvariant_cast `는 기본적으로 이러한 변환을 수행하지 않습니다.

coerceValue(), fromScriptValue(), qvariant_cast()도 참조하십시오 .

QJSValue QJSEngine::globalObject() const

이 엔진의 전역 객체를 반환합니다.

기본적으로 전역 객체에는 Math, Date, String 등 ECMA-262의 일부인 내장 객체들이 포함되어 있습니다. 또한, 전역 객체의 속성을 설정하여 모든 스크립트 코드에서 사용자 정의 확장을 사용할 수 있도록 할 수 있습니다. 스크립트 코드 내의 비국소 변수는 전역 코드의 국소 변수와 마찬가지로 전역 객체의 속성으로 생성됩니다.

[since Qt 6.1] bool QJSEngine::hasError() const

마지막 자바스크립트 실행에서 예외가 발생했거나 ` throwError()`가 호출된 경우 ` true `를 반환합니다. 그렇지 않은 경우 ` false`를 반환합니다. ` evaluate()`는 평가된 코드에서 발생된 모든 예외를 처리한다는 점에 유의하십시오.

이 함수는 Qt 6.1에서 도입되었습니다.

QJSValue QJSEngine::importModule(const QString &fileName)

fileName 에 위치한 모듈을 가져와, 내보낸 모든 변수, 상수 및 함수를 속성으로 포함하는 모듈 네임스페이스 객체를 반환합니다.

엔진에서 해당 모듈을 처음 가져오는 경우, 파일은 로컬 파일 시스템이나 Qt 리소스 시스템의 지정된 위치에서 로드되어 ECMAScript 모듈로 평가됩니다. 파일은 UTF-8 텍스트로 인코딩되어 있어야 합니다.

동일한 모듈을 이후에 다시 가져올 경우, 이전에 가져온 인스턴스가 반환됩니다. 모듈은 싱글톤이며 엔진이 소멸될 때까지 유지됩니다.

지정된 ` fileName `는 내부적으로 ` QFileInfo::canonicalFilePath()`를 사용하여 정규화됩니다. 즉, 서로 다른 상대 경로를 사용하여 디스크상의 동일한 파일을 여러 번 가져오더라도 파일은 한 번만 로드됩니다.

참고: 모듈 로딩 중에 예외가발생하면 반환 값은 해당 예외가 됩니다(일반적으로 Error 객체; QJSValue::isError() 참조).

registerModule()도 참조하십시오 .

void QJSEngine::installExtensions(QJSEngine::Extensions extensions, const QJSValue &object = QJSValue())

표준 ECMAScript 구현에서는 사용할 수 없는 기능을 추가하기 위해 JavaScript extensions 를 설치합니다.

확장 기능은 지정된 object 에 설치되며, 객체가 지정되지 않은 경우 Global Object 에 설치됩니다.

enum 값을 ` OR`로 지정하여 여러 확장 기능을 한 번에 설치할 수 있습니다:

installExtensions(QJSEngine::TranslationExtension | QJSEngine::ConsoleExtension);

Extension도 참조하십시오 .

bool QJSEngine::isInterrupted() const

현재 자바스크립트 실행이 중단되었는지 여부를 반환합니다.

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 )를 감싸는 자바스크립트 객체를 생성합니다. 이 메타객체( metaObject )는 스크립트 엔진보다 오래 지속되어야 합니다. 이 메서드는 정적 메타객체에만 사용하는 것이 좋습니다.

생성자로 호출되면 클래스의 새 인스턴스가 생성됩니다. 스크립트 엔진에서는 ` Q_INVOKABLE `가 노출한 생성자만 볼 수 있습니다.

newQObject() 및 QObject Integration도 참조하십시오 .

QJSValue QJSEngine::newQObject(QObject *object)

JavaScriptOwnership 를 사용하여, 지정된 QObject object 를 래핑하는 JavaScript 객체를 생성합니다.

object 의 시그널 및 슬롯, 속성, 자식 노드는 생성된 QJSValue 의 속성으로 사용할 수 있습니다.

object 가 null 포인터인 경우, 이 함수는 null 값을 반환합니다. object 가 삭제 예정이거나 소멸자가 이미 실행 중인 경우에도 마찬가지입니다.

object 의 클래스(또는 재귀적으로 그 슈퍼클래스)에 대해 기본 프로토타입이 등록된 경우, 새로운 스크립트 객체의 프로토타입은 해당 기본 프로토타입으로 설정됩니다.

지정된 ` object `가 엔진의 제어 범위 밖에서 삭제된 경우, 자바스크립트 래퍼 객체를 통해(스크립트 코드나 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 는 다른 모듈에서 사용되기 전까지는 호출되거나 읽히지 않습니다. 즉, 평가할 코드가 없으므로 다른 모듈이 이 모듈을 로드하려고 시도하다가 예외를 발생시키기 전까지는 오류가 나타나지 않습니다.

경고: 객체가 아닌 QJSValue 에서 명명된 내보내기 항목에 접근하려고시도하면 exception 가 발생합니다.

경고: 모듈이등록되면 , 엔진은 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)

자바스크립트 실행을 중단하거나 다시 활성화합니다.

interrupted 가 true 인 경우, 이 엔진에서 실행 중인 모든 자바스크립트는 즉시 중단되고, interrupted 에 대해 false 값을 지정하여 이 함수가 다시 호출될 때까지 오류 객체를 반환합니다.

이 함수는 스레드 안전합니다. 예를 들어, 자바스크립트 내의 무한 루프를 중단하기 위해 다른 스레드에서 이 함수를 호출할 수 있습니다.

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 를 사용하여 런타임 오류(예외)를 발생시킵니다.

이 메서드는 자바스크립트의 ` throw() ` 표현식에 해당하는 C++ 메서드입니다. 이 메서드를 사용하면 C++ 코드에서 ` QJSEngine`에 런타임 오류를 보고할 수 있습니다. 따라서 이 메서드는 ` 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.