34

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

Style.qml

property color mainbg: 'red'

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

4

6 に答える 6

50

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

于 2014-08-04T16:59:20.377 に答える
26

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

それが役に立てば幸い。

于 2013-03-27T12:27:07.313 に答える
21

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
  }
}
于 2013-03-07T07:42:17.903 に答える
1

qmlファイル間で共有するプロパティを含む新しいQMLオブジェクトファイルをいつでも作成できます。QMLオブジェクトと同じ方法でインポートするだけで、プロパティにアクセスできます。さて、これらのプロパティを変更し、インスタンス間で変更を共有できるようにしたい場合は、非常に扱いにくくなり、.pragmaライブラリのjsファイルを使用したある種のソリューションに頼ることができます。ある種のC++の代替を書きたいのでなければ。

于 2013-03-07T16:45:16.133 に答える