Shuffle QML ListModel
У меня есть ListModel и повторитель. Повторитель рисует Предметы из ListModel, один поверх другого. Это работает отлично до сих пор.
За исключением того, что для каждого запуска приложения я хочу иметь другой порядок отрисовки.
Так что я думаю, что было бы лучше всего "перемешать" ListElements в ListModel перед применением Repeater. Как я могу это сделать?
3 ответа
Используя следующие ответы:
- /questions/39899601/kak-randomizirovat-peremeshat-massiv-javascript/39899636#39899636
- /questions/13557593/preobrazovanie-obekta-v-stroku/13557610#13557610
И адаптируясь к ListModel
Вы получаете следующую функцию:
utils.js
//https://stackru.com/a/2450976/6622587
function shuffle(model){
var currentIndex = model.count, temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex)
currentIndex -= 1
// And swap it with the current element.
// the dictionaries maintain their reference so a copy should be made
// https://stackru.com/a/36645492/6622587
temporaryValue = JSON.parse(JSON.stringify(model.get(currentIndex)))
model.set(currentIndex, model.get(randomIndex))
model.set(randomIndex, temporaryValue);
}
return model;
}
main.qml
import QtQuick 2.9
import QtQuick.Window 2.2
import "utils.js" as Util
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
ListModel {
id: fruitModel
ListElement {
name: "Apple"
cost: 2.45
}
ListElement {
name: "Banana"
cost: 1.95
}
ListElement {
name: "Orange"
cost: 3.25
}
}
Column {
Repeater {
model: Util.shuffle(fruitModel)
Row {
spacing: 10
Text { text: name }
Text { text: '$' + cost }
}
}
}
}
В этой ссылке вы можете найти пример.
Если вы хотите, чтобы ваш оригинал оставался неизменным (то есть неизменным), вы можете контролировать, как он просматривается через файл . Далее мы собираемся инициализироватьDelegateModel
пройти черезListModel
то мы произвольно сделаем ему 10 случайных свопов:
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
Page {
ListView {
anchors.fill: parent
model: ShuffleDelegateModel {
id: shuffleDelegateModel
model: animals
delegate: Frame {
width: ListView.view.width
Text {
text: model.name
}
}
}
}
ListModel {
id: animals
ListElement { name: "cat" }
ListElement { name: "dog" }
ListElement { name: "monkey" }
ListElement { name: "lion" }
ListElement { name: "giraffe" }
ListElement { name: "elephant" }
}
footer: Frame {
RowLayout {
Button {
text: qsTr("Shuffle")
onClicked: shuffleDelegateModel.shuffle(10)
}
}
}
}
//ShuffleDelegateModel.qml
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQml.Models 2.15
DelegateModel {
groups: [
DelegateModelGroup {
id: visibleItems
name: "visible"
includeByDefault: true
}
]
filterOnGroup: "visible"
function shuffle(loops) {
for (let i = 0; i < loops; i++) {
let index = Math.floor(Math.random() * visibleItems.count);
let newIndex = Math.floor(Math.random() * visibleItems.count);
if (index === newIndex) continue;
visibleItems.move(index, newIndex, 1);
}
}
}
Вы можете попробовать это онлайн!
Как насчет вызова функции, а затем вернуть модель.
function shuffle(n)
{
if(n === 1)
return ["apples", "oranges", "pears"];
else if(n === 2)
return ["banana", "oranges", "pears"];
}
Column {
Repeater {
model: shuffle(1)
Text { text: "Data: " + modelData }
}
}