2016-07-18 3 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; 
      } 
     } 
    } 
} 

문제 같은 것은 나 '이다 m 시스템에 의해 작성 및 파기 된 대리자에 속성 isSelected을 저장합니다. 그래서 이것은 나에게 잘못된 해결책을주고있다. 솔루션을 여러 개 선택하거나 개선 할 수있는 더 좋은 방법이 있습니까? QAbstractListModel 하위 클래스로 C++에서 model을 사용하고 있습니다.

답변

0

쉬운 해결책. QPair 또는 QPair를 사용하여 모든 품목의 상태를 저장하십시오.

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

을 그리고 당신은 컬렉션을 선택하고자 할 때, 그냥이 같은 시도 :

typedef QPair<int, bool> ItemState; 

목록 O를 테이블에 복수 선택이 가능

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

당신은 컬렉션을 업데이트해야합니다을 데이터, 모델의 데이터를 수정할 때마다 (이동 요소를 추가, 제거). 사용자가 카드를 클릭하면 클릭 한 이벤트를 처리하고 컬렉션 항목 상태를 수정하고 루프를 호출합니다.

1

나는 대답을 Qt 문서에서 찾았습니다. 간단히 DelegateModel을 사용해야합니다. DelegateModel에 정의 된 모든 그룹에 대해 두 개의 연결된 속성이 각 대리인 항목에 추가되므로 group 속성이 있습니다. 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 
     } 
    } 

다른 솔루션은 C++ 데이터 모델에 재산 isSelected를 이동하고 변경 사항을 업데이트 할 getter 및 setter 함수를 사용했을 것이다.