web-dev-qa-db-ja.com

他のQMLファイルのQMLでグ​​ローバルプロパティを宣言する

構成ファイルでグローバルプロパティを宣言し、他のファイルで使用したい。たとえば、mainbgを次のように宣言します。

Style.qml

property color mainbg: 'red'

他のQMLファイルで使用します(view.qmlおよびmain.qml)。どうすればこの作業を行うことができますか?

24
2 8

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ファイルをロードするには明示的なインポートが必要です)。

37
pixelgrease

基本的に、プロパティバインディングが必要ない場合(値が定数で、変更時に通知する必要がない場合)、次のように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オブジェクトに。

それが役に立てば幸い。

23
TheBootroo

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
  }
}
20
JuliusG

@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 に添付しました。

5
ceztko

このプロパティを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はどこでも使用できます

2
Bibin

Qmlファイル間で共有するプロパティを含む新しいQMLオブジェクトファイルをいつでも作成できます。 QMLオブジェクトと同じ方法でインポートするだけで、プロパティにアクセスできます。これらのプロパティを変更し、インスタンス間で変更を共有できるようにしたい場合は、かなり複雑になります。おそらく、.pragmaライブラリjsファイルを使用した何らかの解決策に頼ることになります。何らかのC++の代替を作成する場合を除きます。

1
Deadron