構成ファイルでグローバルプロパティを宣言し、他のファイルで使用したい。たとえば、mainbg
を次のように宣言します。
Style.qml:
property color mainbg: 'red'
他のQMLファイルで使用します(view.qml
およびmain.qml
)。どうすればこの作業を行うことができますか?
QMLシングルトンを使用します。
このページ の「アプローチ2」を参照してください-い QTBUG-34418 コメントは私のものです。
必要なものは次のとおりです。
Style.qml
pragma Singleton
import QtQuick 2.0
QtObject {
property color mainbg: 'red'
}
qmldir
このファイルは、シングルトン.qmlファイル(Style.qml
この例では)、または相対パスを指定する必要があります。 qmldir
も.qrcリソースファイルに含める必要がある場合があります。 qmldirファイルの詳細については、 here を参照してください。
# 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以降で利用可能です。同じフォルダー内のQMLシングルトンを参照する場合でも、フォルダーimport
ステートメントが必要です。が同じフォルダーの場合は、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
}
}
@pixelgreaseの回答に何らかの貢献を加えると、パス__import "."
_を必要としない別の手法が見つかりました。これはバグ QTBUG-34418 を回避するためです。これは、シングルトンが使用されるqmlファイルとは異なる場所にqmldir
およびシングルトンクラスがある場合に特に便利です。この手法では、ツリー構造内で適切なモジュールを定義する必要があります。モジュールは、QmlEngine::addImportPath(moduleParentPath)
を使用してQMLエンジンにモジュールの親パスを追加することで解決されます。例えば:
_qml/
├── <ModuleName>/
│ ├── <ClassName>.qml
│ ├── qmldir
_
Main.cppには次があります。
_QQmlApplicationEngine engine;
engine.addImportPath("qrc:/qml"); // Can be any directory
engine.load("qrc:/qml/main.qml");
_
リソースを使用する場合、qml.qrc:
_<RCC>
<qresource prefix="/">
(...)
<file>qml/main.qml</file>
<file>qml/MySingletons/MySingleton.qml</file>
<file>qml/MySingletons/qmldir</file>
</qresource>
</RCC>
_
Qmldirで:
_module MySingletons
singleton MySingleton 1.0 MySingleton.qml
_
Main.qml、または別のディレクトリにある他のqmlファイル:
_import MySingletons 1.0
_
次に、通常どおりMySingletonクラスを使用します。参考のため、サンプルMySingletonWithModule.7zをバグ QTBUG-34418 に添付しました。
このプロパティをmainに追加すると、どのqmlでもアクセスできます。これは正しい方法ではないかもしれませんが、これは機能します。
または、プロパティをグループ化する場合は、qmlに追加し、mainにそのqmlを含め、idを指定します。これで、そのidを使用してこのプロパティにアクセスできます。
main.qml
Item{
width:10
height:10
Model{
id:globdldata
}
}
Model.qml
Item {
property color mainbg: 'red'
}
globdldata.mainbgはどこでも使用できます
Qmlファイル間で共有するプロパティを含む新しいQMLオブジェクトファイルをいつでも作成できます。 QMLオブジェクトと同じ方法でインポートするだけで、プロパティにアクセスできます。これらのプロパティを変更し、インスタンス間で変更を共有できるようにしたい場合は、かなり複雑になります。おそらく、.pragmaライブラリjsファイルを使用した何らかの解決策に頼ることになります。何らかのC++の代替を作成する場合を除きます。