2016-07-18 178 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存儲在由系統創建和銷燬的委託中。所以這給了我一個錯誤的解決方案。在解決方案中是否有更好的多重選擇或改進方法?我使用QAbstractListModel來自C++的model

回答

0

一個簡單的解決方案。使用QPair或QPair來存儲所有物品的狀態。

typedef QPair<int, bool> ItemState; 

在列表O表啓用多個選擇:

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

而且當你要選擇一個集合,只是嘗試這樣的事:

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); 
} 

您應該更新您的收藏數據,每次修改模型中的數據(添加,刪除o移動元素)。當用戶點擊卡片時,只需處理點擊的事件並修改您的收藏項目狀態,然後調用循環。

1

我在Qt文檔中找到了答案。我只需要使用DelegateModel。我有group屬性,對於在DelegateModel中定義的每個組,兩個附加屬性都添加到每個代理項目中。表格DelegateModel.in*GroupName*的第一個表示該項目是否屬於該組,並且第二個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 
     } 
    } 

其他的解決辦法是向物業isSelected移動到C++的數據模型,並使用一個getter和setter函數來更新變化。