2016-07-18 133 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函数来更新变化。