22

I'm trying to access a role from a ListView in QML. Essentially, I have this in my QML:

ListView {
    id: myId
    model: myModel
    delegate: Item {
        Text {
            text: model.text
        }
        Text {
            text: model.moreText
        }
    }
}

myModelQAbstractListModel の実装です。これの QML 部分は再利用可能なコンポーネントであるため、モデルはさまざまなデータ型を持つさまざまな役割をいくつでも持つことができます。私がやりたいことはcurrentItem、ListView のプロパティの特定の役割の値にバインドすることです。Componentつまり、次のように、ListView で現在選択されている項目にプロパティをバインドできるページに他のものを追加したいと考えています。

Text {
    text: myId.currentItem.text // Or myId.currentItem.model.text (or something similar)
}

私はこれを一般的に利用できるようにする必要があることに注意してください。これは、多くのモデル タイプに対して多くのことを行う予定であり、各モデルと ListView に対してそのようなカスタム コードを記述しないように努めているためです。

現在選択されているアイテムのプロパティにアクセスするのは簡単なはずですが、私が知る限り、それは不可能です。役割が 1 つしかない場合、モデルの扱いが異なるように見えるという事実によって、問題はさらに複雑になります。これは、model.roleName使用するロールが 1 つしかない場合は、 を介してロールにアクセスする場合があることを意味しますmodelData

誰か提案があれば、本当に感謝します。本当にありがとう!

編集

私はこれを見つけました:

http://comments.gmane.org/gmane.comp.lib.qt.qml/1778

ただし、これは私にはうまくいかないようです。QML スクリプトでデータを使用しようとすると、型エラーが発生します。使用可能な型キャストがないため、どうすればよいかわかりません。どんな提案も大歓迎です!

ありがとう!

ジャック

4

3 に答える 3

30

http://comments.gmane.org/gmane.comp.lib.qt.qml/1778のコードは機能するはずですが、プロパティの名前が「data」の場合はエラーが表示されます。既存の組み込みプロパティをオーバーライドしているようです。名前を「myData」に変更するとうまくいくようです:

ListView {
    id: myId
    model: myModel
    delegate: Item {
        property variant myData: model
        Text {
            text: model.text
        }
        Text {
            text: model.moreText
        }    
    }
}

Text { text: myId.currentItem.myData.text }

(元の投稿のmyId.currentItem.textコードは、存在しないデリゲート内のテキストプロパティを参照しようとしたため、機能しませんでした。)

デリゲート内のmodelと modelDataの参照に関しては、違いはモデル内のロールの数ではなく、モデルのタイプによって異なります。モデルが文字列リストまたはオブジェクト リストの場合、デリゲート内から個々の文字列またはオブジェクトを参照するためにmodelDataが使用されます (文字列リストとオブジェクト リストには役割がないため)。QML ListModel や Qt C++ QAbstractItemModel を含む他のすべてのモデルでは、model.roleを使用してデリゲート内のロールを参照できます。

于 2011-03-09T00:00:06.917 に答える
6

または、次のような方法でモデルに直接アクセスすることもできます

Text { text: myModel[myId.currentIndex].text }
于 2011-05-20T12:42:22.773 に答える
3

get() 関数を使用して ListModel の ListElement にアクセスできます。

Text { text: myModel.get(myId.currentIndex).text }
于 2016-08-30T08:57:17.977 に答える