2016-09-02 11 views
0

カスタムQMLコンポーネント(複数選択が可能なListViewの特殊化)を作成しています。私は、コンポーネントに提供されたオブジェクトに添付プロパティを提供したいと思います。私はどのようにcreate attached properties using C++を参照してください。しかし、私は純粋なQMLでカスタムプロパティを追加することについての情報を見つけることができません。これはQMLを使って可能ですか?QMLのカスタムアタッチプロパティ

+0

誰かが文書から見積もりを見つけなければなりません。 AFAIKにはQML構文はありません。 – Velkan

+1

私はそれがC++からのみ可能だと思います。 –

答えて

4

これはQMLで可能ですか?ただ、所望の特性を実装するアダプタオブジェクトを使用する - QMLでこれに代わる、簡単かつクリーンな方法があります

+0

正解に感謝します。 – Phrogz

+2

ああ、これについては、[このセクション](http://doc.qt.io/qt-5/qtqml-syntax-objectattributes.html#attached-properties-and-attached- [シグナルハンドラ)。 – Phrogz

+2

https://codereview.qt-project.org/#/c/170036/ – Mitch

2

。次に、アダプターにネストだけを接続する代わりに、アダプターを親/コンテナーとして使用します。オブジェクトをアダプタにネストすることで、別のC++排他グループ化プロパティを取得することもできます。このオーバーヘッドを最小限に抑えるには、JSオブジェクトとプロパティを使用することです。変更通知はありませんが、手動で放射することでやや軽減できます。

例:

// Adapter.qml - interface with attached properties 
Item { 
    id: adapter 
    property int customInt : Math.random() * 1000 
    property var group : {"a" : Math.random(), "b" : Math.random() } 
    default property Component delegate 
    width: childrenRect.width 
    height: childrenRect.height 
    Component.onCompleted: delegate.createObject(adapter) 
} 

// usage 
ListView { 
    width: 100 
    height: 300 
    model: 5 
    delegate: Adapter { 
    Row { 
     spacing: 10 
     Text { text: index } 
     Text { text: customInt } 
     Text { text: group.a } 
     Text { text: group.a } 
    } 
    } 
} 

それはいくつかの他のQMLの回避策に比べてかなり無痛と便利です。 parent.parent.customIntを実行する必要はありません。プロパティが直接接続されているかのようにアクセスできます。これは動的スコープのために機能します。 default propertyでは、アダプタに直接必要なデリゲートをネストするプロパティとして内部デリゲートを設定しないようにできます。

それらのアクロバットが行き過ぎている多くのケースで、あなただけの場所でラップすることができます:

ListView { 
    width: 100 
    height: 300 
    model: 5 
    delegate: Item { 
    width: childrenRect.width 
    height: childrenRect.height 
    property string custom1: "another" 
    property string custom2: "set of" 
    property string custom3: "properties" 
    Row { 
     spacing: 10 
     Text { text: index } 
     Text { text: custom1 } 
     Text { text: custom2 } 
     Text { text: custom3 } 
    } 
    } 
} 

ビューが適切にオブジェクトをレイアウトできるように、唯一の重要な部分は、実際にアダプタオブジェクトのサイズのための結合であります。私は日常的には、Wrap要素を本質的には同じですが、C++で実装しています。これはQMLバインディングよりもはるかに効率的です。

+0

あなたは何を提案しているか説明していただけますか?私はそれを描くのに困っている。 – Phrogz

+0

@Phrogzそこに行く – dtech