QQmlEngine Class
QQmlEngine クラスは、QML コンポーネントをインスタンス化するための環境を提供します。詳細...
ヘッダ | #include <QQmlEngine> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
qmake: | QT += qml |
を継承する: | QJSEngine |
継承元: |
プロパティ
- 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も参照してください 。
プロパティのドキュメント
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
現在の URL インターセプターを、与えられたtype の与えられた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 がまだ作成されていない場合、QQmlNetworkAccessManagerFactory がQNetworkAccessManager の作成に使われる;そうでない場合、返される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 の作成に使用する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() のバージョン引数に渡すことができる特別な値を定義する。
定数 | 値 | 説明 |
---|---|---|
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
ファイルで宣言された複合型やスクリプトにも影響することに注意してください。
さらに、この関数が呼ばれた後、C++型をこのuriとメジャーバージョンの組み合わせに登録しようとすると、実行時エラーになります。
モジュール識別子として uri 、メジャーバージョン番号としてmajVersion を持つモジュールが見つかり、ロックされた場合はtrueを返し、そうでない場合はfalseを返します。そうでなければ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)
この関数は、uri からインポートされ、versionMajor とversionMinor から構成されるバージョン番号を持つライブラリの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()、付属プロパティの提供も参照してください 。
[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で利用できるように宣言します。
例えば、C++のクラスSlider
を QML の型名Slider
として利用可能にします。すべてのプロパティ、呼び出し可能なメソッド、列挙型が公開されます。
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)
包含する C++ 名前空間の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 ()マクロは、包含する型には適用されず、FOREIGN_NAMESPACE に適用されることを宣言します。包含する名前空間は、Q_NAMESPACE マクロを使用してメタ・オブジェクト・システムに登録する必要があります。
これは、サードパーティ・ライブラリに属するなどの理由で、マクロを追加するために修正できない名前空間を登録する場合に便利です。
QML_ELEMENT 、QML_NAMED_ELEMENT()、QML_FOREIGN()も参照のこと 。
QML_IMPLEMENTS_INTERFACES(interfaces)
このマクロは、クラスがどの QMLinterfaces を実装しているかを Qt に伝えます。Q_INTERFACES このマクロはQML_INTERFACE を使用しているクラスとのインターフェイスにのみ使用してください。このマクロは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も参照してください 。
© 2025 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.