#qt #listview #model #qml #v-play
#qt #listview #Модель #qml #v-play
Вопрос:
У меня есть ListView
, где отображаемые в данный момент modelData
изменения, когда кнопка переключается между несколькими параметрами отдела. Если в одном из этих отделов нет данных, my delegate
продолжает показывать предыдущий список данных, пока не дойдет до нового раздела modelData
с данными.
Что я хочу сделать, так это когда модель «пуста» (не определена, что может произойти, когда искомый ключ еще не создан в моей базе данных Firebase, или в данный момент элементы не видны), вместо этого отображается текст / изображение; т. е. «Двигайтесь дальше, здесь нечего видеть».
Моя модель взята из JSON, пример приведен ниже. и мой calendarUserItems
является корневым узлом нескольких дочерних узлов в моей базе данных Firebase, моей целью AppButton.groupCycle
было также добавить дополнительное направление к каждому дочернему узлу, фильтруя данные по этому для просмотра и редактирования на странице.
Пример моего кода:
Page {
id: adminPage
property var departments: [1,2,3,4]
property int currGroupIndex: 0
AppButton {
id: groupCycle
text: "Viewing: " departments[currGroupIndex]
onClicked: {
if (currGroupIndex == departments.length - 1)
currGroupIndex = 0;
else
currGroupIndex ;
}
}
ListView {
model: Object.keys(dataModel.calendarUserItems[departments[currGroupIndex]])
delegate: modelData.visible ? currentGroupList : emptyHol
Component {
id: emptyHol
AppText {
text: "nothing to see here move along now!"
}
}
Component {
id: currentGroupList
SimpleRow {
id: container
readonly property var calendarUserItem: dataModel.calendarUserItems[departments[currGroupIndex]][modelData] || {}
visible: container.calendarUserItem.status === "pending" ? true : false
// only pending items visible
// remaining code for simple row
}
}
}
}
примером JSON в моем dataModel.calendarUserItems
является:
"groupName": [
{ "department1":
{ "1555111624727" : {
"creationDate" : 1555111624727,
"date" : "2019-03-15T12:00:00.000",
"name" : "Edward Lawrence",
"status": "pending"
},
//several of these entries within department1
},
},
{ "department2":
{ "1555111624727" : {
"creationDate" : 1555111624456,
"date" : "2019-05-1T12:00:00.000",
"name" : "Katie P",
"status": 1
},
//several of these entries within department2
},
}
//departments 3 amp; 4 as the same
]
Если в отделах 2 и 3 есть modelData
, а в 1 и 4 нет, я хочу, чтобы вместо этого отображался текст, а ListView
пустой, вместо отображения предыдущего modelData
.
Я пытался поиграть с видимостью изображения / текста, но проблема больше связана с очисткой modelData
, и я не уверен, с чего начать?
Любая помощь приветствуется!
Комментарии:
1. как насчет
delegate: someCondition ? Component1 : Component2
?2. Привет @folibis спасибо за указание, я пробовал такие вещи, как
delegate: if(Object.keys(dataModel.calendarUserItems[departments[currGroupIndex]]).length > 0
или!= {}
, но получаю только ошибки в?
неожиданном токене bool ‘?’ чтобы проверить, не пусты ли данные модели, или в ней есть объекты в пределах используемой длины?3. @folibis Я обдумывал ваше предложение с момента моего предыдущего комментария и все еще не могу добиться какого-либо прогресса — где my
modelData
, из массива, а некоторые элементы — нетvisible
, я не могу делать такие вещи, какmodel.count > 0 ? Component1 : Component2
, какие могут быть мои варианты, чтобы либо проверить, нет лиmodelData
вообще, либо нет лиvisible
элементов вSimpleRow
делегате?4.
modelData
не может быть пустым, поскольку движок принимает model как массив и применяет ссылку на каждый элемент какmodelData
на элемент делегирования. Что касаетсяvisible
свойства, не могли бы вы использоватьdelegate: modelData.visible ? Component1 : Component2
?5. Привет @folibis Я думаю, что основная проблема, с которой я сталкиваюсь в настоящее время, связана с моим,
readonly property var calendarUserItem: dataModel.calendarUserItems[departments[currGroupIndex]][modelData] || {}
поскольку, когда уcurrGroupIndex
нет данных, видимых или в базе данных, это приводит к ошибкам и не удаляет предыдущееcurrGroupIndex
представление?
Ответ №1:
Я добился отображения, используя следующее в качестве своего делегата:
delegate: {
if (!(departments[currGroupIndex] in dataModel.calendarUserItems) ) {
return emptyHol;
}
var subgroups = Object.keys(dataModel.calendarUserItems[departments[currGroupIndex]]);
for (var i in subgroups) {
var subgroup = dataModel.calendarUserItems[departments[currGroupIndex]][subgroups[i]];
modelArr.push(subgroup);
}
var modelObect = modelArr.find( function(obj) { return obj.status === "pending"; } );
if (modelObect === undefined) {
return emptyHol;
}
return currentGroupList;
}
Затем, когда мой AppButton.groupCycle
нажат, я добавил modelArr = []
для очистки массива при каждом нажатии, это работает так, как задумано.
Спасибо!
Комментарии:
1. Я не совсем уверен в вашем последнем абзаце… что это за база данных? Так ли это
dataModel.calendarUserItems
? Было ли конкретное сообщение об ошибке?2. Привет @TrebledJ извиняюсь, я отредактировал и вопрос, и ответ! Надеюсь, теперь это для вас понятнее! Спасибо!