設定ファイルでグローバルプロパティを宣言し、それを他のファイルで使用したいと思います。たとえば、次のように宣言mainbg
します。
Style.qml:
property color mainbg: 'red'
他のQMLファイル(view.qml
やなどmain.qml
)で使用します。どうすればこの作業を行うことができますか?
設定ファイルでグローバルプロパティを宣言し、それを他のファイルで使用したいと思います。たとえば、次のように宣言mainbg
します。
Style.qml:
property color mainbg: 'red'
他のQMLファイル(view.qml
やなどmain.qml
)で使用します。どうすればこの作業を行うことができますか?
QML シングルトンを使用します。
このページの「アプローチ 2」を参照してください -- 醜いQTBUG-34418コメントは私のものです。
必要な部品は次のとおりです。
スタイル.qml
pragma Singleton
import QtQuick 2.0
QtObject {
property color mainbg: 'red'
}
qmldir
このファイルは、シングルトン .qml ファイル (この例では) と同じフォルダーにある必要がありますStyle.qml
。または、相対パスを指定する必要があります。qmldir
.qrc リソース ファイルに含める必要がある場合もあります。qmldir ファイルの詳細については、こちらを参照してください。
# qmldir
singleton Style Style.qml
参照方法
import QtQuick 2.0
import "." // this is needed when referencing singleton object from same folder
Rectangle {
color: Style.mainbg // <- there it is!!!
width: 240; height 160
}
このアプローチは Qt5.0 以降で利用できます。import
同じフォルダー内の QML シングルトンを参照する場合でも、フォルダー ステートメントが必要です。が同じフォルダーの場合は、次を使用します。import "."
これは、qt-project ページで文書化したバグです (QTBUG-34418 を参照してください。シングルトンでは、qmldir ファイルをロードするために明示的なインポートが必要です)。
基本的に、プロパティ バインディングが必要ない場合 (値が定数で、変更時に通知する必要がない場合) は、次のように Javascript 共有ライブラリで定義できます。
// MyConstants.js
.pragma library
var mainbg = "red";
そして、次のように QML で使用します。
import "MyConstants.js" as Constants
Rectangle {
color: Constants.mainbg;
}
しかし、これの悪い面は次のとおりです: - 強力な型指定がない (JS は型について実際には認識していない) ため、色でなくても何でも入れることができます。- を変更するmainbg
と、それを使用しているアイテムには変更が通知されず、古い値が保持されます
したがって、型チェックとバインディング/変更通知が必要な場合は、プロパティを main.qml でルート オブジェクトのメンバーとして宣言するだけで、プロパティが実際に直接登録されるため、QML アプリケーションのどこからでもアクセスできるようになります。定義上グローバルな Qml Context オブジェクトに。
それが役に立てば幸い。
js ファイルを作成し、このプロパティを使用する必要があるすべてのファイルにインポートできます。
js ファイル:
//Note: you only need '.pragma library' if you are planning to
//change this variable from multiple qml files
.pragma library
var globalVariable = 20;
qml ファイル:
import "test.js" as Global
Rectangle {
id: main
width: 300; height: 400
Component.onCompleted: {
console.log( Global.globalVariable)
//you can also change it
Global.globalVariable = 5
}
}
qmlファイル間で共有するプロパティを含む新しいQMLオブジェクトファイルをいつでも作成できます。QMLオブジェクトと同じ方法でインポートするだけで、プロパティにアクセスできます。さて、これらのプロパティを変更し、インスタンス間で変更を共有できるようにしたい場合は、非常に扱いにくくなり、.pragmaライブラリのjsファイルを使用したある種のソリューションに頼ることができます。ある種のC++の代替を書きたいのでなければ。