2017-02-01 9 views
0

Qt QMLにはリストデータの表現に使用できるListModelがあります。これは、リストに要素を追加するためのいくつかのメソッドを提供しますが、要素を取得するために私が見つけることができる唯一の方法は、インデックスを期待するget()メソッドです。qml内のListModel内の特定のListElementを見つけるにはどうすればよいですか?

ListModelに特定の要素が含まれているかどうかを確認したいですか?キーと値を使ってListElementオブジェクトを受け取る方法はありますか?

このリストconnsider例えば:

ListModel { 
    id: fruitModel 

    ListElement { 
     name: "Apple" 
     cost: 2.45 
    } 
    ListElement { 
     name: "Orange" 
     cost: 3.25 
    } 
    ListElement { 
     name: "Banana" 
     cost: 1.95 
    } 
} 

は、方法は、ありますfruitModel.get({名:「バナナ」})などの名前「バナナ」を持つ要素を検索し、それらを返すでしょうか?

+0

そのような何か: '(VAR i = 0; I AlexanderVX

答えて

1

リスト要素を反復してチェックする必要があります。

あなたが関手として検索条件を渡すことができます別の検索を実行しようとしている場合には、関数を記述することをお勧めです:

あなたが見つけるために、次のように使用することができます
function find(model, criteria) { 
    for(var i = 0; i < model.count; ++i) if (criteria(model.get(i))) return model.get(i) 
    return null 
} 

"Banana"の名前のアイテム:

find(fruitModel, function(item) { return item.name === "Banana" }) 

複数のヒットが可能な場合は、代わりに、単一のアイテムのアイテムの配列を返す必要があります。

+0

しかし、このメソッドは、すべてではなく、要素を1つだけ返します。 – QtRoS

+0

@QtRoS - 答えの最後の段落を読んでください。 OPは特定の要素についてであって、特定の要素についてではありませんでした。ヒットの配列を返すようにコードを変更するのは簡単です。 – dtech

+0

私は、元の質問ではるかに簡単な解決策を求めていた人にとっては、それが自明ではないと思います。いずれにしても、アイテムの配列を返すことは非常に悪い考えです。 QMLランタイムは、model.get()によって返された参照を格納することは安全ではないことを示しています。だから私の意見では、単純なサイクルが彼の問題を解決します。より高度なシナリオでは、モデル項目のコピーを使用することを検討することがあります。 – QtRoS

関連する問題