QQmlEngine Class
QQmlEngine クラスは、QML コンポーネントをインスタンス化するための環境を提供します。詳細...
Header: | #include <QQmlEngine> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
qmake: | QT += qml |
Inherits: | QJSEngine |
Inherited By: |
プロパティ
- offlineStoragePath : QString
パブリック関数
QQmlEngine(QObject *parent = nullptr) | |
virtual | ~QQmlEngine() override |
void | addImageProvider(const QString &providerId, QQmlImageProviderBase *provider) |
void | addImportPath(const QString &path) |
void | addPluginPath(const QString &path) |
void | addUrlInterceptor(QQmlAbstractUrlInterceptor *urlInterceptor) |
QUrl | baseUrl() const |
void | clearComponentCache() |
void | clearSingletons() |
QQmlImageProviderBase * | imageProvider(const QString &providerId) const |
QStringList | importPathList() const |
QQmlIncubationController * | incubationController() const |
QUrl | interceptUrl(const QUrl &url, QQmlAbstractUrlInterceptor::DataType type) const |
(since 6.6) void | markCurrentFunctionAsTranslationBinding() |
QNetworkAccessManager * | networkAccessManager() const |
QQmlNetworkAccessManagerFactory * | networkAccessManagerFactory() const |
QString | offlineStorageDatabaseFilePath(const QString &databaseName) const |
QString | offlineStoragePath() const |
bool | outputWarningsToStandardError() const |
QStringList | pluginPathList() const |
void | removeImageProvider(const QString &providerId) |
void | removeUrlInterceptor(QQmlAbstractUrlInterceptor *urlInterceptor) |
QQmlContext * | rootContext() const |
void | setBaseUrl(const QUrl &url) |
void | setImportPathList(const QStringList &paths) |
void | setIncubationController(QQmlIncubationController *controller) |
void | setNetworkAccessManagerFactory(QQmlNetworkAccessManagerFactory *factory) |
void | setOfflineStoragePath(const QString &dir) |
void | setOutputWarningsToStandardError(bool enabled) |
void | setPluginPathList(const QStringList &paths) |
T | singletonInstance(int qmlTypeId) |
(since 6.5) T | singletonInstance(QAnyStringView uri, QAnyStringView typeName) |
void | trimComponentCache() |
QList<QQmlAbstractUrlInterceptor *> | urlInterceptors() const |
パブリックスロット
void | retranslate() |
シグナル
void | exit(int retCode) |
(since 6.5) void | offlineStoragePathChanged() |
void | quit() |
void | warnings(const QList<QQmlError> &warnings) |
静的パブリックメンバ
QQmlContext * | contextForObject(const QObject *object) |
void | setContextForObject(QObject *object, QQmlContext *context) |
再実装された保護された関数
virtual bool | event(QEvent *e) override |
関連する非メンバー
enum | QQmlModuleImportSpecialVersions { QQmlModuleImportModuleAny, QQmlModuleImportLatest, QQmlModuleImportAuto } |
QObject * | qmlAttachedPropertiesObject(const QObject *attachee, bool create = true) |
void | qmlClearTypeRegistrations() |
QQmlContext * | qmlContext(const QObject *object) |
QQmlEngine * | qmlEngine(const QObject *object) |
bool | qmlProtectModule(const char *uri, int majVersion) |
int | qmlRegisterAnonymousType(const char *uri, int versionMajor) |
int | qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor, const char *qmlName) |
int | qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason) |
void | qmlRegisterModule(const char *uri, int versionMajor, int versionMinor) |
void | qmlRegisterModuleImport(const char *uri, int moduleMajor, const char *import, int importMajor = QQmlModuleImportLatest, int importMinor = QQmlModuleImportLatest) |
int | qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor) |
int | qmlRegisterSingletonInstance(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *cppObject) |
int | qmlRegisterSingletonType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName) |
int | qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, std::function<QJSValue (QQmlEngine *, QJSEngine *)> callback) |
int | qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, std::function<QObject *(QQmlEngine *, QJSEngine *)> callback) |
int | qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName) |
int | qmlRegisterType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName) |
int | qmlRegisterTypeNotAvailable(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &message) |
int | qmlRegisterUncreatableMetaObject(const QMetaObject &staticMetaObject, const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason) |
int | qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &message) |
int | qmlTypeId(const char *uri, int versionMajor, int versionMinor, const char *qmlName) |
void | qmlUnregisterModuleImport(const char *uri, int moduleMajor, const char *import, int importMajor = QQmlModuleImportLatest, int importMinor = QQmlModuleImportLatest) |
マクロ
QML_ADDED_IN_VERSION(MAJOR, MINOR) | |
QML_ANONYMOUS | |
QML_ATTACHED(ATTACHED_TYPE) | |
(since 6.5) | QML_CONSTRUCTIBLE_VALUE |
QML_DECLARE_TYPE | |
QML_DECLARE_TYPEINFO(Type, Flags) | |
QML_ELEMENT | |
QML_EXTENDED(EXTENDED_TYPE) | |
QML_EXTENDED_NAMESPACE(EXTENDED_NAMESPACE) | |
QML_EXTRA_VERSION(MAJOR, MINOR) | |
QML_FOREIGN(FOREIGN_TYPE) | |
QML_FOREIGN_NAMESPACE(FOREIGN_NAMESPACE) | |
QML_IMPLEMENTS_INTERFACES(interfaces) | |
QML_INTERFACE | |
QML_NAMED_ELEMENT(name) | |
QML_REMOVED_IN_VERSION(MAJOR, MINOR) | |
QML_SEQUENTIAL_CONTAINER(VALUE_TYPE) | |
QML_SINGLETON | |
(since 6.5) | QML_STRUCTURED_VALUE |
QML_UNAVAILABLE | |
QML_UNCREATABLE(reason) | |
QML_VALUE_TYPE(name) |
詳細説明
QQmlEngine は、components と、そこから生成されたオブジェクトを管理し、バインディングや関数を実行するために使用されます。QQmlEngine はQJSEngine も継承しており、QML コンポーネントと JavaScript コードのシームレスな統合を可能にします。
QMLの各コンポーネントはQQmlContext の中にインスタンス化されます。 QMLではコンテキストは階層的に配置され、その階層構造はQQmlEngineによって管理されます。デフォルトでは、コンポーネントはroot context でインスタンス化されます。
QQmlComponent,QQmlContext,QML Global Object,QQmlApplicationEngineも参照してください 。
プロパティ Documentation
offlineStoragePath : QString
このプロパティは、オフラインユーザーデータを格納するディレクトリを保持します。
SQL やその他のオフラインストレージが置かれるディレクトリを返します。
openDatabaseSync()
で作成された SQL データベースはここに格納される。
デフォルトはプラットフォーム標準のユーザアプリケーションデータディレクトリの QML/OfflineStorage。
このパスは現在ファイルシステム上に存在しない可能性があるので、この場所に 新しいファイルを作成したい場合は、まずこのパスを作成する必要があります -QDir::mkpath() を参照してください。
アクセス関数
QString | offlineStoragePath() const |
void | setOfflineStoragePath(const QString &dir) |
通知シグナル:
void | offlineStoragePathChanged() |
Qt Quick Local Storage QML Typesも参照のこと 。
メンバ関数ドキュメント
[explicit]
QQmlEngine::QQmlEngine(QObject *parent = nullptr)
与えられたparent で新しい QQmlEngine を作成します。
[override virtual noexcept]
QQmlEngine::~QQmlEngine()
QQmlEngine を破棄します。
このエンジンで作成されたQQmlContext はすべて無効になりますが、破棄はされません(QQmlEngine オブジェクトの親になっている場合を除く)。
JS エンジンのクリーンアップの詳細については ~QJSEngine() を参照してください。
void QQmlEngine::addImageProvider(const QString &providerId, QQmlImageProviderBase *provider)
image: url スキームでリクエストされた画像に使用するprovider を設定します。ホストはproviderId です。QQmlEngine はprovider の所有権を持ちます。
画像プロバイダは、pixmapとスレッド画像リクエストのサポートを有効にします。画像プロバイダの実装と使い方の詳細については、QQuickImageProvider のドキュメントを参照してください。
QMLソースファイルを読み込む前に、必要な画像プロバイダをすべてエンジンに追加しておく必要があります。
removeImageProvider()、QQuickImageProvider 、QQmlImageProviderBaseも参照してください 。
void QQmlEngine::addImportPath(const QString &path)
URL ベースのディレクトリ構造で、エンジンがインストールされているモジュールを検索するディレクトリとしてpath を追加します。
path は、ローカルファイルシステムのディレクトリ、Qt Resource のパス (:/imports
)、Qt Resource のurl (qrc:/imports
)、URL のいずれかを指定します。
path は、インポートパスリストに追加される前に正規形に変換されます。
新しく追加されたpath は、importPathList() の最初になります。
setImportPathList()、QML モジュール、QML インポートパスも参照。
void QQmlEngine::addPluginPath(const QString &path)
インポートされたモジュール(qmldir
ファイルで参照)のネイティブ プラグインを検索するディレクトリとしてpath を追加します。
デフォルトでは、このリストには.
のみが含まれます。つまり、エンジンはqmldir
ファイル自体のディレクトリを検索します。
新しく追加されたpath は、pluginPathList() で最初に表示されます。
setPluginPathList()も参照してください 。
void QQmlEngine::addUrlInterceptor(QQmlAbstractUrlInterceptor *urlInterceptor)
QMLでURLを解決する際に使用するurlInterceptor 。これはスクリプトファイルやQMLタイプの読み込みに使われるURLにも適用されます。エンジンがファイルを読み込んでいる間は URL インターセプターを変更しないでください。複数の URL インターセプターが指定された場合は、URL ごとに追加された順番に呼び出されます。
QQmlEngine はインターセプターの所有権を持たず、削除もしません。
QUrl QQmlEngine::baseUrl() const
このエンジンのベースURLを返します。ベース URL は、相対 URL がQQmlComponent コンストラクタに渡された場合にのみ、コンポーネントを解決するために使用されます。
ベース URL が明示的に設定されていない場合、このメソッドはアプリケーションの現在の作業ディレクトリを返します。
setBaseUrl()も参照してください 。
void QQmlEngine::clearComponentCache()
エンジンの内部コンポーネント・キャッシュをクリアします。
この関数は、エンジンによって以前にロードされたほとんどのコンポーネントのプロパティ メタデータを破棄します。こ れは、 参照 さ れていない コ ン ポーネ ン ト をエン ジ ンの コ ン ポーネ ン ト キ ャ ッ シ ュ か ら 削除す る こ と に よ っ て実行 さ れます。まだ参照されているコンポーネントを削除することはありません。
参照されているコンポーネントがない場合、この関数はエンジンをロードされたコンポーネント データを含まない状態に戻します。これは、以前のコンポーネント セットの小さなサブセットを再ロードしたり、以前にロードされたコンポーネントの新しいバージョンをロードしたりするのに便利です。
コンポーネントキャッシュがクリアされると、新しいオブジェクトを作成する前にコンポーネントをロードする必要があります。
注意: QML コンポーネントから作成された既存のオブジェクトは、コンポーネントキャッシュをクリアしても、その型が保持されます。これにはシングルトンオブジェクトも含まれます。キャッシュをクリアした後、同じ QML コードからさらにオブジェクトを作成した場合、 新しいオブジェクトは古いオブジェクトとは異なる型になります。このような新しいオブジェクトを、キャッシュをクリアする前に作成されたオブジェクトに属する、宣言された型のプロパティに代入してもうまくいきません。
一般的な経験則として、コンポーネントキャッシュをクリアする際には、QML コンポーネントから作成されたオブジェクトが生きていないことを確認してください。
trimComponentCache() およびclearSingletons()も参照して ください。
void QQmlEngine::clearSingletons()
エンジンが所有するすべてのシングルトンをクリアします。
この関数はすべてのシングルトンインスタンスを削除し、その中からエンジンが所有する QObject を削除します。これはclearComponentCache() を呼び出す前に QML で作成されたオブジェクトが残っていないことを確認するのに便利です。
QObject ベースのシングルトンインスタンスを保持する QML プロパティは、 エンジンがシングルトンを所有している場合は null になり、所有していない場合はその値を保持します。既存の QML オブジェクトにアクセスしてもシングルトンは自動的に再作成されません。新しいコンポーネントがインスタンス化されたときのみ、 シングルトンは再作成されます。
clearComponentCache()も参照してください 。
[static]
QQmlContext *QQmlEngine::contextForObject(const QObject *object)
object のQQmlContext を返すか、コンテキストが設定されていない場合は nullptr を返す。
QQmlEngine がQObject をインスタンス化すると、内部コンテキストが自動的に割り当てられる。このような内部コンテキストは読み取り専用です。コンテキスト・プロパティを設定することはできません。
setContextForObject()、qmlContext()、qmlEngine()、QQmlContext::setContextProperty()も参照 。
[override virtual protected]
bool QQmlEngine::event(QEvent *e)
再実装:QObject::event(QEvent *e)。
[signal]
void QQmlEngine::exit(int retCode)
このシグナルは、エンジンによってロードされたQMLが、指定されたリターンコードretCode でイベントループから抜けたいときに発せられる。
quit()も参照してください 。
QQmlImageProviderBase *QQmlEngine::imageProvider(const QString &providerId) const
見つかればproviderId に設定されている画像プロバイダを返します。そうでなければnullptr
を返します。
QQuickImageProviderも参照して ください。
QStringList QQmlEngine::importPathList() const
URL ベースのディレクトリ構造で、エンジンがインストールされたモジュールを検索するディレクトリのリストを返します。
例えば、/opt/MyApp/lib/imports
がパスの中にあれば、com.mycompany.Feature
をインポートした QML は、QQmlEngine で、そのモジュールが提供するコンポーネントを/opt/MyApp/lib/imports/com/mycompany/Feature/
で探すことになります。qmldir
ファイルは型バージョンマッピングや、場合によってはQML拡張プラグインを定義するために必要です。
デフォルトでは、このリストにはQMLインポートパスで述べたパスが含まれます。
addImportPath() およびsetImportPathList()も参照して ください。
QQmlIncubationController *QQmlEngine::incubationController() const
現在設定されているインキュベーションコントローラを返し、 コントローラが設定されていない場合は 0 を返す。
setIncubationController() も参照 。
QUrl QQmlEngine::interceptUrl(const QUrl &url, QQmlAbstractUrlInterceptor::DataType type) const
指定されたtype の指定されたurl に対して現在の URL インターセプターを実行し、その結果を返します。
[since 6.6]
void QQmlEngine::markCurrentFunctionAsTranslationBinding()
このメソッドがQMLのバインディングの一部である関数の内部で呼ばれた場合、そのバインディングは翻訳バインディングとして扱われます。
class I18nAwareClass : public QObject { //... QString text() const { if (auto engine = qmlEngine(this)) engine->markCurrentFunctionAsTranslationBinding(); return tr("Hello, world!"); } };
注意: この関数はqsTr関数に代わる独自の関数を提供したい場合に便利です。C++クラスから公開されるプロパティが言語変更時に確実に更新されるようにするには、LanguageChange
のイベントに反応させることをお勧めします。これは、クラスが非QMLコンテキストで使用される場合にも動作する、より一般的なメカニズムであり、オーバーヘッドが若干少なくなります。しかし、クラスがすでにQMLエンジンと密接に結びついている場合は、markCurrentFunctionAsTranslationBinding
を使ってもかまいません。詳細は動的な言語変更の準備を参照してください。
この関数は Qt 6.6 で導入されました。
QQmlEngine::retranslateも参照してください 。
QNetworkAccessManager *QQmlEngine::networkAccessManager() const
このエンジンがインスタンス化した QML タイプが使用できる共通のQNetworkAccessManager を返します。
QQmlNetworkAccessManagerFactory QNetworkAccessManager が設定されていて、 がまだ作成されていない場合、 が の作成に使われます。QNetworkAccessManager QQmlNetworkAccessManagerFactory QNetworkAccessManager
setNetworkAccessManagerFactory()も参照のこと 。
QQmlNetworkAccessManagerFactory *QQmlEngine::networkAccessManagerFactory() const
現在のQQmlNetworkAccessManagerFactory を返す。
setNetworkAccessManagerFactory()も参照 。
QString QQmlEngine::offlineStorageDatabaseFilePath(const QString &databaseName) const
databaseName という識別子を持つLocal Storage データベースが存在する (または存在するであろう) ファイルパスを返します。
LocalStorage.openDatabaseSync() も参照 。
[signal, since 6.5]
void QQmlEngine::offlineStoragePathChanged()
このシグナルは、offlineStoragePath が変更されたときに発行されます。
注意: プロパティofflineStoragePath の通知シグナルです。
この関数は Qt 6.5 で導入されました。
bool QQmlEngine::outputWarningsToStandardError() const
警告メッセージがwarnings() シグナルによって発せられるだけでなく、標準エラーにも出力される場合はtrueを返し、そうでない場合はfalseを返します。
デフォルト値はtrueです。
setOutputWarningsToStandardError()も参照してください 。
QStringList QQmlEngine::pluginPathList() const
qmldir
ファイルで参照される)インポートされたモジュールのネイティブプラグインをエンジンが検索するディレクトリのリストを返します。
デフ ォル ト では、 こ の リ ス ト は.
のみを含んでい ます。 すなわち、 エ ン ジ ンはqmldir
フ ァ イ ルのデ ィ レ ク ト リ 自体を検索 し ます。
addPluginPath() およびsetPluginPathList()も参照して ください。
[signal]
void QQmlEngine::quit()
このシグナルはエンジンによってロードされたQMLが終了したいときに発せられる。
exit() も参照 。
void QQmlEngine::removeImageProvider(const QString &providerId)
providerId の画像プロバイダを削除します。
addImageProvider() およびQQuickImageProvider も参照して ください。
void QQmlEngine::removeUrlInterceptor(QQmlAbstractUrlInterceptor *urlInterceptor)
addUrlInterceptor を使って追加されたurlInterceptor を削除します。URL インターセプターは、エンジンがファイルをロードしている間は変更しないでください。
これはインターセプターを削除するのではなく、単にエンジンから削除するだけです。その後、同じエンジンや別のエンジンで再利用することができます。
[slot]
void QQmlEngine::retranslate()
翻訳用にマークされた文字列を使用するすべてのバインディング式をリフレッシュします。
新しいトランスレータをQCoreApplication::installTranslator でインストールした後にこの関数を呼び出すと、ユーザインタフェースに最新の翻訳が表示されるようになります。
QQmlContext *QQmlEngine::rootContext() const
エンジンのルートコンテキストを返します。
ルートコンテキストはQQmlEngine によって自動的に生成されます。 エンジンによってインスタンス化されたすべての QML コンポーネントインスタンスが利用できるデータは、ルートコンテキストに置く必要があります。
コンポーネントインスタンスのサブセットのみが利用できる追加データは、ルートコンテキストの親コンテキストにあるサブコンテキストに追加する必要があります。
void QQmlEngine::setBaseUrl(const QUrl &url)
このエンジンのベース URL をurl に設定します。
baseUrl()も参照してください 。
[static]
void QQmlEngine::setContextForObject(QObject *object, QQmlContext *context)
object のQQmlContext をcontext に設定します。object にすでにコンテキストがある場合は警告が出力されますが、コンテキストは変更されません。
QQmlEngine がQObject をインスタンス化するとき、コンテキストは自動的に設定される。
contextForObject()も参照のこと 。
void QQmlEngine::setImportPathList(const QStringList &paths)
URL ベースのディレクトリ構造で、エンジンがインストールされたモジュールを検索するディレクトリのリストとしてpaths を設定します。
デフォルトでは、このリストにはQML Import Path で説明したパスが含まれます。
警告 setImportPathList を呼び出しても、デフォルトのインポートパスは保持されません。
importPathList() およびaddImportPath()も参照 。
void QQmlEngine::setIncubationController(QQmlIncubationController *controller)
エンジンのインキュベーションcontroller を設定します。エンジンは、アクティブなコントローラを1つだけ持つことができ、そのコントローラの所有権は持ちません。
incubationController()も参照して ください。
void QQmlEngine::setNetworkAccessManagerFactory(QQmlNetworkAccessManagerFactory *factory)
QNetworkAccessManager(s) の作成に使用するfactory を設定します。
QNetworkAccessManager はQMLによるすべてのネットワークアクセスに使用されます。ファクトリーを実装することで、キャッシュ、プロキシ、クッキーに特化したカスタムの を作成することができます。QNetworkAccessManager
ファクトリーはエンジンを実行する前に設定する必要があります。
注意: QQmlEngine はファクトリーの所有権を持ちません。
networkAccessManagerFactory()も参照してください 。
void QQmlEngine::setOutputWarningsToStandardError(bool enabled)
警告メッセージを標準エラー出力するかどうかをenabled に設定します。
enabled が true の場合、QML が生成した警告メッセージはすべて stderr に出力され、warnings() シグナルで出力されます。enabled が偽の場合、warnings() シグナルのみが出力されます。これにより、アプリケーション側で警告出力を処理することができます。
デフォルト値はtrueである。
outputWarningsToStandardError()も参照 。
void QQmlEngine::setPluginPathList(const QStringList &paths)
paths に、 イ ン ポー ト さ れ る モ ジ ュ ール (qmldir
フ ァ イ ル内で参照 さ れ る ) のネ イ テ ィ ブプ ラ グ イ ン を検索す る デ ィ レ ク ト リ の リ ス ト を設定 し ます。
デフ ォル ト では、 こ の リ ス ト は.
のみを含んでい ます。 すなわち、 エ ン ジ ンはqmldir
フ ァ イ ルのデ ィ レ ク ト リ 自体を検索 し ます。
pluginPathList() およびaddPluginPath()も参照して ください。
template <typename T> T QQmlEngine::singletonInstance(int qmlTypeId)
qmlTypeId で登録されたシングルトン型のインスタンスを返します。
テンプレート引数Tは、QJSValue またはQObject から派生した型へのポインタであり、シングルトンがどのように登録されたかに依存します。Tのインスタンスがまだ作成されていない場合、今作成される。qmlTypeId が有効なシングルトンタイプを表していない場合、デフォルトで構築されたQJSValue かnullptr
が返されます。
QObject* 例
class MySingleton : public QObject { Q_OBJECT // Register as default constructed singleton. QML_ELEMENT QML_SINGLETON static int typeId; // ... }; MySingleton::typeId = qmlTypeId(...); // Retrieve as QObject* QQmlEngine engine; MySingleton* instance = engine.singletonInstance<MySingleton*>(MySingleton::typeId);
QJSValue 例
// Register with QJSValue callback int typeId = qmlRegisterSingletonType(...); // Retrieve as QJSValue QQmlEngine engine; QJSValue instance = engine.singletonInstance<QJSValue>(typeId);
QMLの型IDはシングルトンクラスにstaticメンバとして格納することを推奨します。qmlTypeId() による検索はコストがかかります。
QML_SINGLETON,qmlRegisterSingletonType(),qmlTypeId()も参照して ください。
[since 6.5]
template <typename T> T QQmlEngine::singletonInstance(QAnyStringView uri, QAnyStringView typeName)
これはオーバーロードされた関数です。
uri で指定されたモジュールから、typeName という名前のシングルトン型のインスタンスを返します。
このメソッドは、qmlTypeId を呼び出した後に id ベースの singletonInstance のオーバーロードを呼び出す代わりに使用できます。シングルトンに繰り返しアクセスする必要がある場合は、typeIdをキャッシュすることで、type-id based overload 。
テンプレート引数Tは、QJSValue 、またはQObject-派生型へのポインタのどちらかであり、シングルトンがどのように登録されたかに依存する。Tのインスタンスがまだ作成されていなければ、今作成される。typeName が有効なシングルトン型を表していない場合、デフォルトで構築されたQJSValue かnullptr
が返されます。
QQmlEngine engine; MySingleton *singleton = engine.singletonInstance<MySingleton *>("mymodule", "MySingleton"); /
この関数は Qt 6.5 で導入されました。
QML_SINGLETON 、qmlRegisterSingletonType()、qmlTypeId()も参照してください 。
void QQmlEngine::trimComponentCache()
エン ジ ンの内部 コ ン ポーネ ン ト キ ャ ッ シ ュ を ト リ ーム し ます。
この関数は、現在使用されていないロードされたコンポーネントのプロパティ メタデータを破棄します。
コンポーネント自体のインスタンス、そのコンポーネントを使用する他のコンポーネントのインスタンス、またはそれらのコンポーネントによってインスタンス化されたオブジェクトが存在する場合、そのコンポーネントは使用中であるとみなされます。
clearComponentCache()も参照 。
QList<QQmlAbstractUrlInterceptor *> QQmlEngine::urlInterceptors() const
現在アクティブなURLインターセプターのリストを返します。
[signal]
void QQmlEngine::warnings(const QList<QQmlError> &warnings)
このシグナルはQMLによってwarnings メッセージが生成されたときに発せられます。
関連する非メンバー
enum QQmlModuleImportSpecialVersions
qmlRegisterModuleImport() およびqmlUnregisterModuleImport() の version 引数に渡すことのできる特別な値を定義します。
定数 | 値 | 説明 |
---|---|---|
QQmlEngine::QQmlModuleImportModuleAny | -1 | ベースモジュールの majorVersion として渡された場合、インポートがどのバージョンのモジュールにも適用されることを示します。 |
QQmlEngine::QQmlModuleImportLatest | -1 | インポートされるモジュールのメジャー・バージョンまたはマイナー・バージョンとして 渡された場合、指定されたメジャー・バージョンの最新の全体バージョンまたは 最新のマイナー・バージョンがインポートされることを示す。 |
QQmlEngine::QQmlModuleImportAuto | -2 | インポートされたモジュールのメジャーバージョンとして渡されたときは、ベースモジュールのバージョンが転送されることを意味します。 |
template <typename T> QObject *qmlAttachedPropertiesObject(const QObject *attachee, bool create = true)
このテンプレート関数の形式は
template<typename T> QObject *qmlAttachedPropertiesObject(const QObject *attachee, bool create = true)
これは、指定されたattachee にアタッチ型T によってアタッチされたアタッチオブジェクトインスタンスを返す。
create が真で、T型が有効なアタッチ型である場合、これは新しいアタッチされたオブジェクト・インスタンスを生成して返す。
T型が有効なアタッチ型でない場合、またはcreate が偽で、attachee に対して以前にアタッチオブジェクトインスタンスが作成されていない場合、nullptr
を返す。
QML_ATTACHED() および添付プロパティの提供も参照してください 。
void qmlClearTypeRegistrations()
qmlRegisterType() で生成されたものなど、保存されているすべての型登録をクリアします。
QQmlEngine が存在する間はこの関数を呼ばないでください。この関数を呼び出す前に、既存の QQmlEngines をすべて削除する必要があります。この関数はアプリケーションのグローバルキャッシュにのみ影響します。QQmlEngine を削除すると、そのエンジンに関連するすべてのキャッシュデータがクリアされます。
QQmlContext *qmlContext(const QObject *object)
object に関連付けられたQQmlContext があれば、それを返します。これはQQmlEngine::contextForObject (オブジェクト)と同等です。
メモ: この関数を使用するには#include <QtQml>
を追加します。
contextForObject() およびqmlEngine()も参照してください 。
QQmlEngine *qmlEngine(const QObject *object)
object に関連付けられたQQmlEngine があれば、それを返します。これはQQmlEngine::contextForObject(object)->engine() と同等であるが、より効率的である。
注意: この関数を使用するには、#include <QtQml>
を追加します。
contextForObject() およびqmlContext()も参照してください 。
bool qmlProtectModule(const char *uri, int majVersion)
この関数は、モジュールがそれ以上変更されないように保護します。これは、他のプラグインがあなたのモジュールに型を注入するのを防ぐために使用できます。また、このインポートに達すると、新しい型やプラグインの可能性のチェックを省略することができるため、パフォーマンスの向上にもつながります。
qmlProtectModuleが呼び出されると、QMLエンジンはモジュールをロードするための新しいqmldir
ファイルを検索しなくなります。しかし、以前に読み込んだqmldir
ファイルは再利用されます。従って、この時点で存在する型は引き続き動作します。異なるQMLエンジンは異なるモジュールをロードする可能性があることに注意してください。しかし、モジュールの保護はグローバルであり、すべてのエンジンに影響します。qmldir
ファイルを探したり、プラグインを読み込んだりするオーバヘッドは、遅い ファイルシステムでは顕著になるかもしれません。そのため、モジュールをロードする必要がなくなったと確信した時点でモジュールを保護することは、良い最適化になり得ます。モジュールロックはプラグインだけでなく、import
やprefer
のような他の qmldir ディレクティブや、qmldir
ファイルで宣言された複合型やスクリプトにも影響することに注意してください。
さらに、この関数が呼ばれた後、この uri とメジャーバージョンの組み合わせに C++ 型を登録しようとすると、実行時エラーになります。
モジュール識別子として uri 、メジャーバージョン番号としてmajVersion を持つモジュールが見つかり、ロックされた場合はtrueを返し、そうでない場合はfalseを返します。見つかるためには、モジュールにエクスポートされた型が含まれていなければなりません。
template <typename T> int qmlRegisterAnonymousType(const char *uri, int versionMajor)
このテンプレート関数はC++の型を無名型としてQMLシステムに登録します。結果として得られるQMLの型は名前を持ちません。したがって、この型のインスタンスをQMLシステムから生成することはできません。しかし、この型のインスタンスが他の型のプロパティとして公開されている場合には、アクセスすることができます。
この関数は、その型が名前によって参照されない場合、特にプロパティバインディングの左辺で使用されるC++型に使用します。型がどのモジュールに属するかを示すには、uri とversionMajor を使用します。
例えば、次の2つのクラスを考えてみましょう:
class Bar : public QObject { Q_OBJECT Q_PROPERTY(QString baz READ baz WRITE setBaz NOTIFY bazChanged) public: Bar() {} QString baz() const { return mBaz; } void setBaz(const QString &baz) { if (baz == mBaz) return; mBaz = baz; emit bazChanged(); } signals: void bazChanged(); private: QString mBaz; }; class Foo : public QObject { Q_OBJECT Q_PROPERTY(Bar *bar READ bar CONSTANT FINAL) public: Foo() {} Bar *bar() { return &mBar; } private: Bar mBar; };
QMLでは、bar
のbaz
プロパティに文字列を代入します:
Foo { bar.baz: "abc" Component.onCompleted: print(bar.baz) }
QMLエンジンがBar
型がbaz
プロパティを持つことを知るためには、Bar
を知る必要があります:
qmlRegisterType<Foo>("App", 1, 0, "Foo"); qmlRegisterAnonymousType<Bar>("App", 1);
Foo
型はQMLの中でインスタンス化されるため、qmlRegisterType()の要素名を取るバージョンに登録する必要があります。
QMLの型IDを返します。
QML_ANONYMOUS 、「C++とQMLの正しい統合方法の選択」も参照して ください。
template <typename T, typename E> int qmlRegisterExtendedType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
このテンプレート関数は、versionMajor とversionMinor から構成されるバージョン番号を持つuri からインポートされたライブラリに、qmlName という名前で C++ 型とその拡張オブジェクトを QML システムに登録します。メインの型では利用できないプロパティは拡張オブジェクトで検索されます。
QML の型 ID を返します。
QML_EXTENDED(),qmlRegisterType(),拡張オブジェクトの登録も参照してください 。
template <typename T, typename E> int qmlRegisterExtendedUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason)
このテンプレート関数は、versionMajor とversionMinor から構成されるバージョン番号を持つuri からインポートされたライブラリの中のqmlName という名前の C++ 型とその拡張を QML システムに登録します。
この型は名前と型を持っていますが、作成することはできません。ユーザがこの型のインスタンスを作成しようとすると、reason というエラーメッセージが表示されます。
これは、その型が付属プロパティや列挙値、抽象基底クラスとその拡張子のみを提供することを意図している場合に便利です。
QMLの型IDを返します。
QML_EXTENDED(),QML_UNCREATABLE(),qmlRegisterUncreatableType()も参照 。
void qmlRegisterModule(const char *uri, int versionMajor, int versionMinor)
この関数はversionMajor とversionMinor で指定されたバージョンで特定のuri のモジュールを登録します。
この関数は、そのバージョンに対応する型が登録されていなくても、特定のモジュール・バージョンを利用できるようにするために使用できます。これは、関連するモジュールのバージョンを同期させておくのに特に便利です。
void qmlRegisterModuleImport(const char *uri, int moduleMajor, const char *import, int importMajor = QQmlModuleImportLatest, int importMinor = QQmlModuleImportLatest)
メジャーバージョンmoduleMajor のモジュールuri に対して qmldir-import を登録します。
これはqmldirファイルのimport
ステートメントと同じ効果があります:importMinor バージョンmoduleMajor のuri がインポートされるたびに、バージョンimportMajor のimport も自動的にインポートされます。importMajor がQQmlModuleImportLatest の場合、そのモジュールの最新バージョンがインポートされ、importMinor は関係ない。importMinor がQQmlModuleImportLatest の場合、importMajor の最新マイナーバージョンが選択される。importMajor がQQmlModuleImportAuto の場合、import のバージョンがuri のバージョンとしてインポートされ、importMinor は関係ありません。moduleMajor がQQmlModuleImportModuleAny の場合、モジュールのインポートはuri のメジャー・バージョンに適用されます。 例えば、MyModuleのどのバージョンがインポートされるときでも、 MyOtherModuleの最新バージョンがインポートされるように指定できます。その場合、以下の呼び出しが適切でしょう:
qmlRegisterModuleImport("MyModule", QQmlModuleImportModuleAny, "MyOtherModule", QQmlModuleImportLatest);
あるいは、「MyModule」のメジャーバージョン5がインポートされるときはいつでも、「MyOtherModule」のバージョン3.14をインポートするように指定することもできます:
qmlRegisterModuleImport("MyModule", 5, "MyOtherModule", 3, 14);
最後に、"MyModule "がインポートされるたびに、常に同じバージョンの "MyOtherModule "をインポートしたい場合は、次のように指定してください:
qmlRegisterModuleImport("MyModule", QQmlModuleImportModuleAny, "MyOtherModule", QQmlModuleImportAuto);
qmlUnregisterModuleImport()も参照してください 。
template <typename T, int metaObjectRevision> int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor)
このテンプレート関数は、versionMajor とversionMinor から構成されるバージョン番号を持つuri からインポートされたライブラリに、指定されたリビジョンのC++型をQMLシステムに登録します。
QMLの型IDを返します。
template<typename T, int metaObjectRevision> int qmlRegisterRevision(const char *uri, int versionMajor, int versionMinor);
この関数は通常、指定されたバージョンの型に使用する基底クラスのリビジョンを登録する ために使用される(「型のリビジョンとバージョン」を参照)。
int qmlRegisterSingletonInstance(const char *uri, int versionMajor, int versionMinor, const char *typeName, QObject *cppObject)
この関数はシングルトンオブジェクトcppObject 、特定のuri とtypeName を登録するために使用される。そのバージョンはversionMajor とversionMinor の組み合わせである。
シングルトン型をURIに登録することで、QMLのコードに任意の機能(メソッドやプロパティ)を持たせることができます。
与えられた型Tのオブジェクトをシングルトン型として登録するにはこの関数を使います。
QObject シングルトン型は登録された型名で参照することができます。この型名はConnections 型のターゲットとして、あるいは他の型IDと同様に使用することができます。ただし、1つだけ例外があります。QObject シングルトン型のプロパティは、シングルトン型名が他の項目と同じコンポーネント内のオブジェクトを識別しないため、エイリアスできません。
注: cppObject は使用される QML エンジンより長生きしなければなりません。さらに、 cppObject はエンジンと同じスレッド親和性を持たなければなりません。複数のエンジンに別々のシングルトンインスタンスを使いたい場合は、qmlRegisterSingletonType を使う必要があります。スレッドセーフの詳細については、スレッドと QObjectsを参照してください。
注意:qmlRegisterSingletonは、そのモジュールのすべての型が手続き的に登録されている場合にのみ使用できます。
使い方
// First, define your QObject which provides the functionality. class SingletonTypeExample : public QObject { Q_OBJECT Q_PROPERTY(int someProperty READ someProperty WRITE setSomeProperty NOTIFY somePropertyChanged) public: explicit SingletonTypeExample(QObject* parent = nullptr) : QObject(parent) {} Q_INVOKABLE int doSomething() { setSomeProperty(5); return m_someProperty; } int someProperty() const { return m_someProperty; } void setSomeProperty(int val) { if (m_someProperty != val) { m_someProperty = val; emit somePropertyChanged(val); } } signals: void somePropertyChanged(int newValue); private: int m_someProperty = 0; };
// Second, create an instance of the object // allocate example before the engine to ensure that it outlives it QScopedPointer<SingletonTypeExample> example(new SingletonTypeExample); QQmlEngine engine; // Third, register the singleton type provider with QML by calling this // function in an initialization function. qmlRegisterSingletonInstance("Qt.example.qobjectSingleton", 1, 0, "MyApi", example.get());
使用法:登録されたシングルトン型をQMLで使用するためには、対応するバージョンのURIをインポートする必要があります。
import QtQuick 2.0 import Qt.example.qobjectSingleton 1.0 Item { id: root property int someValue: MyApi.someProperty Component.onCompleted: { console.log(MyApi.doSomething()) } }
QML_SINGLETON およびqmlRegisterSingletonTypeも参照して ください。
int qmlRegisterSingletonType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName)
この関数は、versionMajor とversionMinor から構成されるバージョン番号を持つuri からインポートされたライブラリに、qmlName という名前のシングルトン型を登録するために使用することができます。この型はurl にあるQMLファイルによって定義されます。urlは絶対URLでなければなりません。すなわち、url.isRelative() == falseです。
さらに、この型のQMLファイルはimport文の中にpragma Singleton文を持っていなければなりません。
シングルトン型はそれが登録された型名で参照することができ、この型名はConnections 型のターゲットとして使用することもできますし、他の型IDと同様に使用することもできます。この例外として、シングルトン型のプロパティはエイリアスできない(シングルトン型名は、同じコンポーネント内のオブジェクトを他の項目として識別しないため)。
使い方
// First, define your QML singleton type which provides the functionality. pragma Singleton import QtQuick 2.0 Item { property int testProp1: 125 }
// Second, register the QML singleton type by calling this function in an initialization function. qmlRegisterSingletonType(QUrl("file:///absolute/path/SingletonType.qml"), "Qt.example.qobjectSingleton", 1, 0, "RegisteredSingleton");
登録されたシングルトン型をQMLで使用するためには、シングルトン型をインポートする必要があります。
import QtQuick 2.0 import Qt.example.qobjectSingleton 1.0 Item { id: root property int someValue: RegisteredSingleton.testProp1 }
qmlRegisterSingletonType関数を使わずにQMLのシングルトン型を登録させることも可能です。その場合、QMLファイルのimportの中にpragma Singleton文を追加します。さらに、その型はsingletonキーワードを持つqmldirファイルで定義され、そのqmldirはsingletonを使用するQMLファイルによってインポートされなければなりません。
QML_SINGLETONも参照 。
int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, std::function<QJSValue (QQmlEngine *, QJSEngine *)> callback)
この関数はシングルトンタイププロバイダcallback をuri とtypeName の特定の場所に、versionMajor とversionMinor で指定されたバージョンで登録するために使用されます。
シングルトンタイプをインストールすることで、開発者はクライアントに任意の機能(メソッドやプロパティ)を提供することができます。
シングルトンタイプは、QObject またはQJSValue のいずれかである。この関数は、QJSValue をシングルトンタイプとして返すシングルトンタイプ提供関数を登録するために使用されるべきである。
注: QJSValue シングルトンタイププロパティは、変更されてもバインディング再評価のトリガーにはなりません。
使用方法
// First, define the singleton type provider function (callback). static QJSValue example_qjsvalue_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine) { Q_UNUSED(engine) static int seedValue = 5; QJSValue example = scriptEngine->newObject(); example.setProperty("someProperty", seedValue++); return example; } // Second, register the singleton type provider with QML by calling this function in an initialization function. qmlRegisterSingletonType("Qt.example.qjsvalueApi", 1, 0, "MyApi", example_qjsvalue_singletontype_provider);
代わりに、C++11 ラムダを使用することもできます:
qmlRegisterSingletonType("Qt.example.qjsvalueApi", 1, 0, "MyApi", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QJSValue { Q_UNUSED(engine) static int seedValue = 5; QJSValue example = scriptEngine->newObject(); example.setProperty("someProperty", seedValue++); return example; });
登録されたシングルトン型をQMLで使用するためには、シングルトン型をインポートする必要があります。
import QtQuick 2.0 import Qt.example.qjsvalueApi 1.0 as ExampleApi Item { id: root property int someValue: ExampleApi.MyApi.someProperty }
QML_SINGLETON 、「C++とQMLの正しい統合方法の選択」も参照して ください。
template <typename T> int qmlRegisterSingletonType(const char *uri, int versionMajor, int versionMinor, const char *typeName, std::function<QObject *(QQmlEngine *, QJSEngine *)> callback)
この関数は、シングルトン型プロバイダcallback を、uri とtypeName で指定されたバージョンで、versionMajor とversionMinor で指定されたバージョンで登録するために使用することができます。
シングルトン型をuriに登録することで、開発者はクライアントがその型をインスタンス化することなく、任意の機能(メソッドやプロパティ)をクライアントに提供することができるようになります。
QObject QJSValueこの関数は、与えられた型TのQObject をシングルトン型として返すシングルトンタイプ提供関数を登録するために使用されるべきである。
QObject シングルトン型は、登録された型名で参照することができ、この型名はConnections 型のターゲットとして使用することができる。この例外として、QObject のシングルトン型のプロパティはエイリアスしてはならない。
注意:シングルトン型プロバイダから返されたQObject シングルトン型のインスタンスは、そのオブジェクトに明示的な QQmlEngine::CppOwnership フラグが設定されていない限り、QMLエンジンが所有する。
使用方法
// First, define your QObject which provides the functionality. class SingletonTypeExample : public QObject { Q_OBJECT Q_PROPERTY (int someProperty READ someProperty WRITE setSomeProperty NOTIFY somePropertyChanged) public: SingletonTypeExample(QObject *parent = nullptr) : QObject(parent), m_someProperty(0) { } ~SingletonTypeExample() {} Q_INVOKABLE int doSomething() { setSomeProperty(5); return m_someProperty; } int someProperty() const { return m_someProperty; } void setSomeProperty(int val) { m_someProperty = val; emit somePropertyChanged(val); } signals: void somePropertyChanged(int newValue); private: int m_someProperty; }; // Second, define the singleton type provider function (callback). static QObject *example_qobject_singletontype_provider(QQmlEngine *engine, QJSEngine *scriptEngine) { Q_UNUSED(engine) Q_UNUSED(scriptEngine) SingletonTypeExample *example = new SingletonTypeExample(); return example; } // Third, register the singleton type provider with QML by calling this function in an initialization function. qmlRegisterSingletonType<SingletonTypeExample>("Qt.example.qobjectSingleton", 1, 0, "MyApi", example_qobject_singletontype_provider);
別の方法として、C++11のラムダを使うこともできます:
qmlRegisterSingletonType<SingletonTypeExample>("Qt.example.qobjectSingleton", 1, 0, "MyApi", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * { Q_UNUSED(engine) Q_UNUSED(scriptEngine) SingletonTypeExample *example = new SingletonTypeExample(); return example; });
登録されたシングルトン型をQMLで使うためには、シングルトン型をインポートする必要があります。
import QtQuick 2.0 import Qt.example.qobjectSingleton 1.0 Item { id: root property int someValue: MyApi.someProperty Component.onCompleted: { someValue = MyApi.doSomething() } }
QML_SINGLETON 、「C++とQMLの正しい統合方法の選択」も参照して ください。
template <typename T> int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
このテンプレート関数は、versionMajor とversionMinor から構成されるバージョン番号を持つuri からインポートされたライブラリに、qmlName という名前でC++の型をQMLシステムに登録します。
QMLの型IDを返します。
このテンプレート関数には2つの形式があります:
template<typename T> int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName); template<typename T, int metaObjectRevision> int qmlRegisterType(const char *uri, int versionMajor, int versionMinor, const char *qmlName);
前者は型Tを新しい型として登録する標準的な形式です。後者は、あるクラスの特定のリビジョンを指定されたバージョンに登録するものです(「型のリビジョンとバージョン」を参照)。
例えば、"com.mycompany.qmlcomponents "という名前空間のバージョン1.0のC++クラスMySliderItem
をSlider
という名前のQML型として登録します:
qmlRegisterType<MySliderItem>("com.mycompany.qmlcomponents", 1, 0, "Slider");
このように登録された型は、指定された型名前空間とバージョン番号をインポートすることで QMLで利用できるようになります:
import com.mycompany.qmlcomponents 1.0 Slider { // ... }
なお、ライブラリの実際のバージョンよりも古いバージョンに型が登録されることは全く問題ありません。実際、新しいライブラリが以前のバージョンで書かれたQMLを使用できるようにすることは、たとえそのライブラリの一部の型がより高度なバージョンで使用できるようになったとしても、通常のことです。
QML_ELEMENT 、QML_NAMED_ELEMENT()、C++とQMLの正しい統合方法の選択も参照してください 。
int qmlRegisterType(const QUrl &url, const char *uri, int versionMajor, int versionMinor, const char *qmlName)
この関数は、versionMajor とversionMinor から構成されるバージョン番号を持つuri からインポートされたライブラリに、qmlName という名前でQMLシステムに型を登録します。この型はurl にあるQMLファイルで定義されます。urlは絶対URLでなければなりません。すなわち、url.isRelative() == falseです。
通常、QMLファイルは他のQMLファイルから直接、あるいはqmldirファイルを使って型として読み込むことができます。この関数は、起動時に型マッピングを手続き的に決定する必要がある場合などに、 C++のコードからファイルを型に登録することを可能にします。
登録に失敗した場合は-1を返す。
int qmlRegisterTypeNotAvailable(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &message)
この関数は、versionMajor とversionMinor から構成されるバージョン番号を持つuri からインポートされた型名前空間のqmlName という名前の型をQMLシステムに登録しますが、その型をインスタンス化しようとすると、与えられたエラーmessage が発生します。
通常、プラグインによってエクスポートされる型は固定されているはずです。しかし、C++の型が利用できない場合には、少なくともQMLの型名を "予約 "し、利用できない型の利用者に意味のあるエラーメッセージを与えるべきです。
QMLの型IDを返します。
例
#ifdef NO_GAMES_ALLOWED qmlRegisterTypeNotAvailable("MinehuntCore", 0, 1, "Game", "Get back to work, slacker!"); #else qmlRegisterType<MinehuntGame>("MinehuntCore", 0, 1, "Game"); #endif
例:"MinehuntCore "型名前空間をインポートしているQMLで、この型を使おうとした場合、エラーメッセージが表示されます:
fun.qml: Get back to work, slacker! Game { ^
これがなければ、一般的な "Game is not a type "というメッセージが表示されます。
QML_UNAVAILABLE 、qmlRegisterUncreatableType()、C++とQMLの正しい統合方法の選択も参照してください 。
int qmlRegisterUncreatableMetaObject(const QMetaObject &staticMetaObject, const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &reason)
この関数は、versionMajor とversionMinor から構成されるバージョン番号を持つuri からインポートされたライブラリのqmlName という名前で、staticMetaObject とその拡張機能を QML システムに登録します。
メタオブジェクトのインスタンスは生成できません。ユーザが作成しようとすると、与えられたreason のエラーメッセージが表示されます。
この関数はQ_NAMESPACE 名前空間を登録するのに便利です。
QMLの型IDを返します。
例えば
namespace MyNamespace { Q_NAMESPACE enum MyEnum { Key1, Key2, }; Q_ENUM_NS(MyEnum) } //... qmlRegisterUncreatableMetaObject(MyNamespace::staticMetaObject, "io.qt", 1, 0, "MyNamespace", "Access to enums & flags only");
QML側では、登録したenumが使えるようになります:
Component.onCompleted: console.log(MyNamespace.Key2)
QML_ELEMENT,QML_NAMED_ELEMENT(),QML_UNCREATABLE()も参照して ください。
template <typename T> int qmlRegisterUncreatableType(const char *uri, int versionMajor, int versionMinor, const char *qmlName, const QString &message)
このテンプレート関数は、versionMajor とversionMinor から構成されるバージョン番号を持つuri からインポートされたライブラリに、qmlName という名前で C++ 型を QML システムに登録します。
この型は名前と型を持っていますが、作成することはできず、作成しようとするとmessage のようなエラーが発生します。
これは、型が付属プロパティや列挙値を提供することのみを目的としている場合に便利です。
QMLの型IDを返します。
QML_UNCREATABLE(),qmlRegisterTypeNotAvailable(),C++とQMLの正しい統合方法の選択も参照 。
int qmlTypeId(const char *uri, int versionMajor, int versionMinor, const char *qmlName)
特定のuri でqmlName という名前で登録され、versionMajor とversionMinor で指定されたバージョンの型のQML型IDを返します。
この関数はqmlRegisterType() やqmlRegisterSingletonType() のようなQMLの型登録関数と同じ値を返します。
qmlName 、uri 、versionMajor が登録された型と一致するが、versionMinor で指定されたマイナーバージョンの方が高い場合、最も近いマイナーバージョンを持つ型のidが返される。
一致する型が見つからなかったり、与えられたパラメータのいずれかが無効だった場合は -1 を返します。
注意: : qmlTypeId は、まだどのエンジンからもアクセスされていなくても、 モジュールを利用可能にしようとします。このため、初めてモジュールにアクセスしたときにオーバーヘッドが発生する可能性があります。存在しないモジュールから型を探そうとすると、常にこのオーバーヘッドが発生します。
QML_ELEMENT,QML_NAMED_ELEMENT,QML_SINGLETON,qmlRegisterType(),qmlRegisterSingletonType()も参照のこと 。
void qmlUnregisterModuleImport(const char *uri, int moduleMajor, const char *import, int importMajor = QQmlModuleImportLatest, int importMinor = QQmlModuleImportLatest)
qmlRegisterModuleImport() で以前に登録されたモジュールのインポートを削除する。
この関数を呼び出すと、バージョンmoduleMajor のuri がインポートされたときに、バージョンimportMajor.importMinor のimport が自動的にインポートされなくなります。バージョン解決は、qmlRegisterModuleImport() と同じように動作します。
qmlRegisterModuleImport()も参照 。
マクロ・ドキュメント
QML_ADDED_IN_VERSION(MAJOR, MINOR)
囲んでいる型または名前空間が、指定されたMAJOR.MINOR バージョンで追加されたことを宣言します。このバージョンは、メソッド、スロット、シグナルのQ_REVISION() マクロ、およびQ_PROPERTY() で宣言されたプロパティの REVISION() 属性で指定されたリビジョンと一致しているものとみなされます。
QML_ADDED_IN_VERSION()はその型や名前空間がQML_ELEMENT 、QML_NAMED_ELEMENT()、QML_ANONYMOUS 、QML_INTERFACE マクロを持つことによりQMLで利用可能な場合にのみ有効になります。
もしその型が属するQMLモジュールがこの方法で決定されたバージョンよりも低いバージョンでインポートされた場合、QMLの型は見えなくなります。
QML_ELEMENT およびQML_NAMED_ELEMENTも参照して ください。
QML_ANONYMOUS
囲んでいる型が利用可能であることを宣言しますが、QMLでは匿名です。この型はQMLでは作成することも、プロパティを宣言することもできませんが、 C++から渡されると認識されます。QMLでは、C++で宣言されたこの型のプロパティを使用することができます。
QML_ELEMENT 、QML_NAMED_ELEMENT()、QML_UNCREATABLE()、QML_INTERFACEも参照してください 。
QML_ATTACHED(ATTACHED_TYPE)
ATTACHED_TYPE を他の型にアタッチされたプロパティとして宣言します。これはその型がQML_ELEMENT またはQML_NAMED_ELEMENT() マクロを用いて QML に公開されている場合に有効です。
注意: 既に名前空間の中にいる場合でも、クラス名は完全修飾する必要があります。
QML_ELEMENT 、QML_NAMED_ELEMENT()、qmlAttachedPropertiesObject()、Providing Attached Propertiesも参照して ください。
[since 6.5]
QML_CONSTRUCTIBLE_VALUE
周囲の値型を構築可能なものとしてマークします。つまり、この型のプロパティに JavaScript の値を代入するときに、引数をちょうど 1 つ取るこの型のQ_INVOKABLE コンストラクタを使用できます。
コンストラクタ可能な値型は次のように宣言できます:
class MyValueType { Q_GADGET QML_VALUE_TYPE(myValueType) QML_CONSTRUCTIBLE_VALUE public: Q_INVOKABLE MyValueType(double d); // ... };
上記の型の場合、次のQMLコードは与えられたコンストラクタを使ってMyValueType
の値を生成し、プロパティに代入します。
QtObject { property myValueType v: 5.4 }
このようにして値のリストを作ることもできます:
QtObject { property list<myValueType> v: [5.4, 4.5, 3.3] }
値の型をアドレス指定できるようにすれば、型アサーションでそのような型を使って明示的に値を構成することができます:
pragma ValueTypeBehavior: Addressable QtObject { function process(d: real) { let v = d as myValueType; // v is a myValueType now, not a number } }
このマクロは Qt 6.5 で導入されました。
QML_VALUE_TYPEも参照して ください。
QML_DECLARE_TYPE
Q_DECLARE_METATYPE(TYPE *)
およびQ_DECLARE_METATYPE(QQmlListProperty<TYPE>)
QML_DECLARE_TYPEINFO(Type, Flags)
指定されたFlags によって記述された、与えられたType の追加プロパティを宣言します。
現在サポートされている型情報はQML_HAS_ATTACHED_PROPERTIES
のみです。これはType が付加プロパティをサポートしていることを宣言しています。QML_DECLARE_TYPEINFO() はType がQML_ATTACHED マクロを含む場合は不要です。
QML_ELEMENT
クラス名や名前空間名をQMLの要素名として、その型や名前空間がQMLで利用可能であることを宣言します。
例えば、Slider
という C++ クラスを、Slider
という QML 型として利用できるようにします。すべてのプロパティ、呼び出し可能なメソッド、列挙型が公開されます。
class Slider : public QObject { Q_OBJECT QML_ELEMENT Q_PROPERTY(int value READ value WRITE setValue NOTIFY valueChanged FINAL) // ... public: enum Slippiness { Dry, Wet, Icy }; Q_ENUM(Slippiness) Q_INVOKABLE void slide(Slippiness slippiness); // ... }
ビルドシステムを使って、メジャーバージョン1
の型名前空間com.mycompany.qmlcomponentsに登録することができます。qmakeの場合は、プロジェクトファイルで以下のように指定します:
CONFIG += qmltypes QML_IMPORT_NAME = com.mycompany.qmlcomponents QML_IMPORT_MAJOR_VERSION = 1
CMake では、URI とバージョンを qt_add_qml_module に渡します。
qt6_add_qml_module(myapp URI com.mycompany.qmlcomponents VERSION 1.0 )
一度登録された型は、同じ型の名前空間とバージョン番号をインポートすることで QML で使用することができます:
import com.mycompany.qmlcomponents 1.0 Slider { value: 12 Component.onCompleted: slide(Slider.Icy) // ... }
また、Q_ENUM_NS のタグが付けられた列挙型を公開するために、Q_NAMESPACE のタグが付けられた名前空間を利用できるようにすることもできます:
namespace MyNamespace { Q_NAMESPACE QML_ELEMENT enum MyEnum { Key1, Key2, }; Q_ENUM_NS(MyEnum) }
QML では、その列挙型を使用することができます:
Component.onCompleted: console.log(MyNamespace.Key2)
注意:同じ名前のクラスが異なる名前空間に存在する場合、その両方に QML_ELEMENT を使用すると衝突が発生します。どちらか一方にQML_NAMED_ELEMENT() を使うようにしてください。
注意: 既に名前空間内にある場合でも、クラス名は完全修飾する必要があります。
C++とQMLの正しい統合方法の選択、QML_NAMED_ELEMENT()、Q_REVISION()、QML_ADDED_IN_VERSION()も参照してください 。
QML_EXTENDED(EXTENDED_TYPE)
囲んでいる型が、QMLでさらにプロパティ、メソッド、列挙を提供するための 拡張としてEXTENDED_TYPE を使用することを宣言します。これはその型がQML_ELEMENT またはQML_NAMED_ELEMENT() マクロを使って QML に公開されている場合に有効です。
警告 EXTENDED_TYPE のメンバは暗黙的に FINAL として扱われます。
注意 : 既に名前空間の中にいる場合でも、クラス名は完全修飾する必要があります。
QML_ELEMENT 、QML_NAMED_ELEMENT()、QML_EXTENDED_NAMESPACE()、拡張オブジェクトの登録も参照してください 。
QML_EXTENDED_NAMESPACE(EXTENDED_NAMESPACE)
囲んでいる型がQMLでさらに列挙を提供するための拡張としてEXTENDED_NAMESPACE を使うことを宣言します。これはその型がQML_ELEMENT またはQML_NAMED_ELEMENT() マクロを使用して QML に公開されている場合に有効です。列挙型がメタオブジェクトシステムに公開されている必要があります。
例えば、次のような C++ コードがあるとします。
namespace MyNamespace { Q_NAMESPACE enum MyEnum { MyEnumerator = 10 }; Q_ENUM_NS(MyEnum) } class QmlType : public QObject { Q_OBJECT QML_ELEMENT QML_EXTENDED_NAMESPACE(MyNamespace) }
QMLで列挙型にアクセスすることができます:
QmlType { property int i: QmlType.MyEnumerator // i will be 10 }
注: EXTENDED_NAMESPACE はQObject や QGadget にすることもできます。この場合、QML_EXTENDED とは対照的に、 はメソッドやプロパティも公開しますが、公開されるのは列挙のみです。
EXTENDED_NAMESPACE つまり、Q_NAMESPACE マクロを含む名前空間か、QObject/QGadgetでなければなりません。
注意 : 既に名前空間内にいる場合でも、クラス名は完全修飾する必要があります。
QML_ELEMENT 、QML_NAMED_ELEMENT ()、QML_EXTENDED ()、拡張オブジェクトの登録、Q_ENUM 、Q_ENUM_NSも参照して ください。
QML_EXTRA_VERSION(MAJOR, MINOR)
MAJORMINORこれは、ある型が複数のメジャー・バージョンで利用可能である場合に役立ちます。
型は自動的に登録される:
- その型が導入されたメジャーバージョン。QML_ADDED_IN_VERSION を参照。
- 型が導入されたメジャーバージョン。
- そのモジュールの現在のメジャーバージョン。それ以前にQML_REMOVED_IN_VERSION 。
注目すべきは、上記の間のPAST_MAJOR_VERSIONSには自動的に登録されないということです。QML_EXTRA_VERSIONを使用することで、さらにメジャーなバージョンに手動で型を登録することができます。
注意: 複数のPAST_MAJOR_VERSIONSを保持することは計算量が多くなります。
QML_ELEMENT およびQML_ADDED_IN_VERSIONも参照してください 。
QML_FOREIGN(FOREIGN_TYPE)
QML_ELEMENT 、QML_NAMED_ELEMENT ()、QML_ANONYMOUS 、QML_INTERFACE 、QML_UNCREATABLE ()、QML_SINGLETON 、QML_ADDED_IN_VERSION ()、QML_REMOVED_IN_VERSION ()、QML_ADDED_IN_MINOR_VERSION ()、QML_REMOVED_IN_MINOR_VERSION ()、QML_EXTENDED ()、QML_EXTENDED_NAMESPACE ()マクロは、C++の包含型には適用されず、FOREIGN_TYPE に適用されます。包含型は、Q_GADGET またはQ_OBJECT マクロを使用して、メタ・オブジェクト・システムに登録する必要があります。
これは、サードパーティのライブラリに属しているなどの理由で、マクロを追加するために修正できない型を登録する場合に便利です。名前空間を登録するには、QML_FOREIGN_NAMESPACE ()を参照してください。
注: QML_ELEMENT の代わりに、QML_NAMED_ELEMENT ()を使用するとよいでしょう。QML_ELEMENT では、要素の名前は、外部型ではなく、それが含まれる構造体の名前になります。C++による高度なQML拡張の書き方」の「外部オブジェクトの統合」の章を参照し てください。
注: QML_ATTACHED ()は現在のところ、このようにリダイレクトすることはできません。qmlAttachedProperties()を実装している同じ型の中で指定する必要があります。
注意: クラス名は、すでに名前空間の中にいる場合でも、完全修飾する必要があります。
QML_ELEMENT 、QML_NAMED_ELEMENT()、QML_FOREIGN_NAMESPACE()も参照してください 。
QML_FOREIGN_NAMESPACE(FOREIGN_NAMESPACE)
QML_ELEMENT Q_NAMESPACE 、 ()、 、 、 ()、 、 ()、 ()、 ()、 ()マクロを含む C++ ネームスペースは、そのネームスペースを囲む型には適用されず、QML_NAMED_ELEMENT QML_ANONYMOUS QML_INTERFACE QML_UNCREATABLE QML_SINGLETON QML_ADDED_IN_VERSION QML_REMOVED_IN_VERSION QML_ADDED_IN_MINOR_VERSION QML_REMOVED_IN_MINOR_VERSION FOREIGN_NAMESPACEに適用されることを宣言します。
これは、サードパーティ・ライブラリに属するなどの理由で、マクロを追加するために修正できない名前空間を登録する場合に便利です。
QML_ELEMENT 、QML_NAMED_ELEMENT()、QML_FOREIGN()も参照して ください。
QML_IMPLEMENTS_INTERFACES(interfaces)
このマクロはクラスがどの QMLinterfaces を実装しているかを Qt に伝えます。このマクロはQML_INTERFACE を使用するクラスとのインターフェイスにのみ使用し、それ以外の場合はQ_INTERFACES を使用してください。このマクロはQML_ELEMENT による宣言的な登録が正しく機能するために必要です。
QML_INTERFACE およびQ_INTERFACESも参照して ください。
QML_INTERFACE
このマクロはC++の型をインターフェースとしてQMLに登録します。
QMLでインターフェースとして登録された型は、メタオブジェクトシステムでも インターフェースとして宣言する必要があります。例えば
struct FooInterface { QML_INTERFACE public: virtual ~FooInterface(); virtual void doSomething() = 0; }; Q_DECLARE_INTERFACE(FooInterface, "org.foo.FooInterface")
このようにQMLに登録された型はプロパティ型として使用することができます:
Q_PROPERTY(FooInterface *foo READ foo WRITE setFoo)
(FooInterface *foo READ foo WRITE setFoo) このプロパティにQObject のサブクラスを代入すると、QMLエンジンは自動的にFooInterface*
へのインターフェイスキャストを行います。
インターフェイス型はQMLでは暗黙の匿名型であり、作成不可能です。
注意:QML_INTERFACE を使用している型から継承する場合は、Q_INTERFACES の代わりにQML_IMPLEMENTS_INTERFACES を使用してください。
QML_IMPLEMENTS_INTERFACES()、QML_ELEMENT 、QML_NAMED_ELEMENT()、QML_UNCREATABLE()、QML_ANONYMOUSも参照して ください。
QML_NAMED_ELEMENT(name)
QMLで使用可能な型や名前空間を宣言します。name を要素名として使用します。それ以外はQML_ELEMENT と同じ動作をします。
class SqlEventDatabase : public QObject { Q_OBJECT QML_NAMED_ELEMENT(EventDatabase) // ... };
C++とQMLの正しい統合方法の選択と QML_ELEMENTも参照してください 。
QML_REMOVED_IN_VERSION(MAJOR, MINOR)
指定されたMAJOR.MINOR バージョンで、囲んでいる型や名前空間が削除されたことを宣言します。これは主にQMLの型の実装を置き換えるときに便利です。同じQML名の別の型や名前空間に対応するQML_ADDED_IN_VERSION() が存在する場合、MAJOR.MINOR よりも低いバージョンのモジュールをインポートするときには削除された型が使われ、MAJOR.MINOR 以上のバージョンのモジュールをインポートするときには追加された型が使われます。
QML_REMOVED_IN_VERSION() は、QML_ELEMENT 、QML_NAMED_ELEMENT()、QML_ANONYMOUS 、QML_INTERFACE のマクロを持つことで、型や名前空間が QML で利用可能な場合にのみ有効になります。
QML_ELEMENT およびQML_NAMED_ELEMENTも参照してください 。
QML_SEQUENTIAL_CONTAINER(VALUE_TYPE)
このマクロは囲む型または参照される型をVALUE_TYPE の一連の要素を管理する逐次コンテナとして宣言します。VALUE_TYPE は実際の値型でも オブジェクト型へのポインタでもかまいません。コンテナは通常テンプレートなので、このマクロを実際のコンテナ宣言に追加できることはほとんどありません。型登録をテンプレートのインスタンス化に添付するには、QML_FOREIGN を使用する必要があります。このテクニックを使えば、たとえば、このように連続したコンテナを宣言することができる:
class IntDequeRegistration { Q_GADGET QML_FOREIGN(std::deque<int>) QML_ANONYMOUS QML_SEQUENTIAL_CONTAINER(int) };
この後、そのコンテナをQMLのJavaScriptの配列のように使うことができます。
class Maze { Q_OBJECT Q_ELEMENT // 0: North, 1: East, 2: South, 3: West Q_PROPERTY(std::deque<int> solution READ solution CONSTANT FINAL) [...] }
Item { Maze { id: maze } function showSolution() { maze.solution.forEach([...]) } }
注意: QMLの値型の場合、QList は自動的にシーケンシャルコンテナとして登録されます。QML Object型の場合、QQmlListProperty 。これらの登録を追加する必要はありません。
注意: 現在、コンテナにカスタム名を付けることはできない。QML_NAMED_ELEMENT に渡された引数はすべて無視される。自動的に登録されるシーケンシャル・コンテナは、list< QtObject>や list<font>のように、おなじみのlist<...>の名前で利用できます。
注意: すでに名前空間の中にいる場合でも、クラス名は完全修飾する必要があります。
QML_ANONYMOUS およびQML_FOREIGN()も参照してください 。
QML_SINGLETON
QMLにおいて、囲んでいる型をシングルトンにすることを宣言します。これはその型がQ_OBJECT であり、かつ QML で利用可能な場合(QML_ELEMENT またはQML_NAMED_ELEMENT()マクロを持つ場合)にのみ有効です。デフォルトでは、QQmlEngine は、その型が最初にアクセスされたときに、その型のデフォルトコンストラクタか、T *create(QQmlEngine *, QJSEngine *)
のシグネチャを持つ静的ファクトリ関数を使用して、シングルトンインスタンスを生成しようとします。両方が存在し、アクセス可能な場合、デフォルトコンストラクタが優先されます。デフォルトコンストラクタもファクトリ関数も存在しない場合、シングルトンはアクセスできません。通常、QMLエンジンはシングルトンの所有権を持ち、エンジン自体が破壊されるとシングルトンを削除します。これを防ぐにはシングルトンに対してQJSEngine::setObjectOwnership() を呼び出します。
デフォルトで構成可能なクラスをシングルトンとして宣言するには、 QML_SINGLETON を追加するだけです:
class MySingleton : public QObject { Q_OBJECT QML_ELEMENT QML_SINGLETON // Q_PROPERTY( ... ) public: // members, Q_INVOKABLE functions, etc. };
もしシングルトンクラスがデフォルト構築可能ではないが、変更可能であれば、 ファクトリー関数を追加することでアクセス可能にすることができます:
class MySingleton : public QObject { Q_OBJECT QML_ELEMENT QML_SINGLETON // Q_PROPERTY( ... ) public: static MySingleton *create(QQmlEngine *qmlEngine, QJSEngine *jsEngine) { MySingleton *result = nullptr; // Create the object using some custom constructor or factory. // The QML engine will assume ownership and delete it, eventually. return result; } // members, Q_INVOKABLE functions, etc };
クラスを変更できず、デフォルトのコンストラクタも適切なファクトリ関数もない場合は、QML_FOREIGN ラッパーを用意してファクトリ関数を定義します:
struct SingletonForeign { Q_GADGET QML_FOREIGN(MySingleton) QML_SINGLETON QML_NAMED_ELEMENT(MySingleton) public: static MySingleton *create(QQmlEngine *, QJSEngine *engine) { MySingleton *result = nullptr; // Create the instance using some custom constructor or factory. // The QML engine will assume ownership and delete it, eventually. return result; } };
最後に、特定のシングルトン・オブジェクトを提供したい場合、その生成は制御できませんが、ファクトリー関数からそのオブジェクトを返すことができます。これはqmlRegisterSingletonInstance 関数の代わりとなるものです。もし
qmlRegisterSingletonInstance("MyModule", 1, 0, "MySingleton", myObject);
MySingleton *
を呼び出していた場合、代わりに次のようにすることができます:
struct SingletonForeign { Q_GADGET QML_FOREIGN(MySingleton) QML_SINGLETON QML_NAMED_ELEMENT(MySingleton) public: // Initialize this using myObject where you would previously // call qmlRegisterSingletonInstance(). inline static MySingleton *s_singletonInstance = nullptr; static MySingleton *create(QQmlEngine *, QJSEngine *engine) { // The instance has to exist before it is used. We cannot replace it. Q_ASSERT(s_singletonInstance); // The engine has to have the same thread affinity as the singleton. Q_ASSERT(engine->thread() == s_singletonInstance->thread()); // There can only be one engine accessing the singleton. if (s_engine) Q_ASSERT(engine == s_engine); else s_engine = engine; // Explicitly specify C++ ownership so that the engine doesn't delete // the instance. QJSEngine::setObjectOwnership(s_singletonInstance, QJSEngine::CppOwnership); return s_singletonInstance; } private: inline static QJSEngine *s_engine = nullptr; };
このようにすると、既存のクラスMySingleton
は QML のシングルトンとして宣言され、MySingleton
と呼ばれます。このようにすることで、既存のクラスs_singletonInstance
はQMLのシングルトンとして宣言され、 と呼ばれます。 メンバを設定することで、使用する前にいつでもインスタンスを指定することができます。MySingleton
自体を変更する必要はありません。
注意: シングルトンが複数のQMLエンジンからアクセスされる場合や、 アクセスするQMLエンジンがシングルトン自身と異なるスレッド親和性を持つ場合、 このパターンは機能しません。上で示したように、create()
メソッドのパラメータで、エンジンの同一性とスレッド親和性をチェックすることで、アサートすることができます。
QML_ELEMENT 、QML_NAMED_ELEMENT()、qmlRegisterSingletonInstance()、QQmlEngine::singletonInstance()、QMLのシングルトンも参照してください 。
[since 6.5]
QML_STRUCTURED_VALUE
周囲の値型を構造化型としてマークする。構造化された値型は、JavaScriptオブジェクトからプロパティごとに構築することができます。しかし、構造化された値型は常にQML_CONSTRUCTIBLE_VALUE 。つまり、プリミティブ型からの構築を処理するために、Q_INVOKABLE コンストラクタを提供することができます。
構造化値型は次のように宣言できます:
class MyValueType { Q_GADGET QML_VALUE_TYPE(myValueType) QML_STRUCTURED_VALUE Q_PROPERTY(double d READ d WRITE setD) Q_PROPERTY(string e READ e WRITE setE) // ... };
そして、この型のプロパティに次のように入力することができます:
QtObject { property myValueType v: ({d: 4.4, e: "a string"}) }
余分な括弧は、JavaScriptコードブロックとして解釈されるかもしれないものからJavaScriptオブジェクトを区別するために必要です。
この方法で値のリストを作成することもできます:
QtObject { property list<myValueType> v: [ {d: 4.4, e: "a string"}, {d: 7.1, e: "another string"} ] }
値型をアドレス指定できるようにすれば、型アサーションでそのような型を使って明示的に構築することができます:
pragma ValueTypeBehavior: Addressable QtObject { function process(d: real) { let v = {d: d, e: objectName} as myValueType; // v is a myValueType now } }
このマクロはQt 6.5で導入されました。
QML_VALUE_TYPE およびQML_CONSTRUCTIBLE_VALUEも参照して ください。
QML_UNAVAILABLE
このマクロはQMLで囲む型が利用できないことを宣言します。このマクロはQQmlTypeNotAvailable
と呼ばれる内部のダミー型をQML_FOREIGN() 型として登録し、さらに指定された QML マクロを使用します。
通常、モジュールからエクスポートされる型は固定されているはずです。しかし、C++の型が利用できない場合には、少なくともQMLの型名を「予約」し、利用できない型の利用者に意味のあるエラーメッセージを与えるべきです。
例
#ifdef NO_GAMES_ALLOWED struct MinehuntGame { Q_GADGET QML_NAMED_ELEMENT(Game) QML_UNAVAILABLE QML_UNCREATABLE("Get back to work, slacker!"); }; #else class MinehuntGame : public QObject { Q_OBJECT QML_NAMED_ELEMENT(Game) // ... }; #endif
このようにすると、"Game "型を使おうとするQMLにはエラーメッセージが表示されます:
fun.qml: Get back to work, slacker! Game { ^
このテクニックを使えば、エラーメッセージをカスタマイズするために必要なのはQ_GADGET 構造体だけで、本格的なQObject は必要ありません。QML_UNCREATABLE() を使わなくても、QML_UNAVAILABLE は完全に未知の型に対する通常の "is not a type" よりも具体的なエラーメッセージを出力します。
注意: 既に名前空間の中にいる場合でも、クラス名は完全修飾する必要があります。
QML_ELEMENT 、QML_NAMED_ELEMENT()、QML_UNCREATABLE()、QML_FOREIGN()も参照 。
QML_UNCREATABLE(reason)
囲んでいる型はQMLから生成できないことを宣言します。この宣言は、QML_ELEMENT またはQML_NAMED_ELEMENT() マクロによって、その型が QML から利用可能である場合に有効です。QMLから型を作成しようとした場合、reason がエラーメッセージとして出力されます。
特に、QML_ANONYMOUS で公開される型や、QML_ELEMENT やQML_NAMED_ELEMENT() で公開される名前空間などです。
Qt 6.0以降では、""を理由の代わりに使用することで、標準的なメッセージを使用することができます。
QML_ELEMENT 、QML_NAMED_ELEMENT()、QML_ANONYMOUSも参照してください 。
QML_VALUE_TYPE(name)
QMLで使用可能な型や名前空間を宣言します。name を名前として使用します。型は値型でなければならず、名前は小文字でなければなりません。
class MyValueType { Q_GADGET QML_VALUE_TYPE(myValueType) // ... };
C++ と QML の正しい統合方法の選択と QML_NAMED_ELEMENTも参照してください 。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。