2016-07-18 15 views
1

ListViewから複数のアイテムを選択します。 C++で、私は上記のコードは、比較のために、ポインタを使用しています。このListViewから複数のアイテムを選択

if (clicked_card->is_selected) { 
    clicked_card->is_selected = false; 
    int i = 0; 
    while(selected_cards[i] != clicked_card) i++; 
    selected_cards.erase(selected_cards.begin() + i); 
} else { 
    clicked_card->is_selected = true; 
    selected_cards.push_back(clicked_card); 
} 

ような何かをやっているだろう。だからどのようにそのような選択QMLで。私が作ってみた解決策は、上記のコードでこの

Card.qml

Image { 
    id: delegate 
    property bool isSelected: false 
    ... 
    MouseArea { 
     onClicked: { 
      if(isSelected === true) { 
       isSelected = false; 
       gameScene.deselectCard(selectSeq); 
      } 
      else { 
       isSelected = true; 
       gameScene.selectCard({'opParam': opParam, 'selectSeq': selectSeq}); 
      } 
     } 
    } 
} 

GameScene.qml

Item { 
    id: gameScene 
    property var selectedCards: [] 

    signal selectCard(variant userData) 
    onSelectCard: { 
     gameScene.selectedCards.push(userData) 
    } 

    signal deselectCard(variant userData) 
    onDeselectCard: { 
     for (var i = 0; i < gameScene.selectedCards.length; i += 1) { 
      if (gameScene.selectedCards[i].selectSeq == userData) { 
       gameScene.selectedCards.splice(i, 1); 
       break; 
      } 
     } 
    } 
} 

問題のようなものであることは、私が「ということですシステムによって作成され破棄されるデリゲート内にプロパティisSelectedを格納しています。これは私に虚偽の解決策を与えています。ソリューションの複数の選択や改良点がありますか?私はmodelをC++から使用しています。QAbstractListModelをサブクラス化しています。

答えて

0

簡単な解決策です。 QPairまたはQPairを使用して、すべてのアイテムの状態を保存します。

typedef QPair<int, bool> ItemState; 

リスト0テーブルで複数選択を有効にする:あなたは、あなたのコレクションを更新する必要があり

QList<ItemState> collection; 
foreach (ItemState& el , collection) { 
    const int row = el.first; 
    const bool state = el.second; 
    const QModelIndex& index = ui->tableView->model()->index(row, 0); 
    ui->tableView->selectionModel()->select(index, state ? QItemSelectionModel::Select : QItemSelectionModel::Deselect); 
} 

ui->tableView->setSelectionMode(QAbstractItemView::MultiSelection); 

そして、あなたは、コレクションを選択したいとき、ちょうどこのような何かを試してみてくださいモデル内のデータを変更するたびに(データの追加、移動要素の削除)ユーザーがカードをクリックすると、クリックされたイベントを処理してコレクションアイテムの状態を変更し、ループを呼び出すだけです。

1

私はQtの回答を見つけました。私は単にDelegateModelを使用する必要があります。私はgroupプロパティを持っています。DelegateModelで定義されたすべてのグループに対して、2つの添付プロパティが各デリゲートアイテムに追加されます。 DelegateModel.in*GroupName*という形式の最初の項目は、その項目がそのグループに属しているかどうかを保持し、第2の項目DelegateModel.*groupName*Indexは、その項目の項目のインデックスを保持しています。

import QtQuick 2.0 
    import QtQml.Models 2.2 

    Rectangle { 
     width: 200; height: 100 

     DelegateModel { 
      id: visualModel 
      model: ListModel { 
       ListElement { name: "Apple" } 
       ListElement { name: "Orange" } 
      } 

      groups: [ 
       DelegateModelGroup { name: "selected" } 
      ] 

      delegate: Rectangle { 
       id: item 
       height: 25 
       width: 200 
       Text { 
        text: { 
         var text = "Name: " + name 
         if (item.DelegateModel.inSelected) 
          text += " (" + item.DelegateModel.selectedIndex + ")" 
         return text; 
        } 
       } 
       MouseArea { 
        anchors.fill: parent 
        onClicked: item.DelegateModel.inSelected = !item.DelegateModel.inSelected 
       } 
      } 
     } 

     ListView { 
      anchors.fill: parent 
      model: visualModel 
     } 
    } 

他の解決策は、C++データモデルにプロパティisSelectedを移動し、変更を更新するためにゲッターとセッター関数を使用することであったであろう。

関連する問題