web-dev-qa-db-ja.com

QMLのリストビューからcurrentItemのロールにどのようにアクセスしますか?

QMLのListViewからロールにアクセスしようとしています。基本的に、これはQMLにあります。

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

myModelはQAbstractListModelの実装です。このQML部分は再利用可能なコンポーネントであるため、モデルはさまざまなデータ型を持つ任意の数の異なる役割を持つことができます。私がやりたいのは、ListViewのcurrentItemプロパティの特定のロールの値にバインドすることです。つまり、次のように、リストビューで現在選択されているアイテムにプロパティをバインドできる他のComponentをページに配置したいと思います。

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スクリプトでデータを使用しようとすると、型エラーが発生します。また、型キャストが利用できないため、どうすればよいかわかりません。どんな提案でも大歓迎です!

ありがとう!

ジャック

20
Jack Benson

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コードは、を参照しようとしていたため、機能しませんでした)存在しなかったデリゲート内のtextプロパティ。)

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

26
blam

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

Text { text: myModel[myId.currentIndex].text }
6
Henry Haverinen

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

Text { text: myModel.get(myId.currentIndex).text }
2