Я хочу выбрать несколько элементов из 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
в делегите, который создается и уничтожается системой. Так что это дает мне ложное решение. Есть ли лучший способ множественного выбора или каких-либо улучшений в решении? Я использую model
из C++ путем подкласса QAbstractListModel
.