#qt #listview #qml
Вопрос:
У меня есть 3 вложенных ListView
s.Первый-это месяц, второй-день, а третий-час дня.Все они строят календарь.Есть загрузчик , который загружает окно, когда я нажимаю в течение часа ListView
, и устанавливает текст в a Label
.Этот текст может отображаться в режиме просмотра часов и может быть удален или отредактирован через указанное выше окно .К сожалению, текст не может быть сохранен, потому что, когда я прокручиваю ListView
s, делегаты меняются и не сохраняют контекст метки(я полагаю, это нормально).Цель состоит в том, чтобы иметь возможность сохранять эти тексты на этикетке(хранить данные) и восстанавливать их при закрытии и повторном открытии приложения. Ниже приведен пример общего кода для 3 ListView
s:
ApplicationWindow{
id:appwindow
............
Item{
id:dayView
...........
ListView{
id:monthofdayCalendar
orientation:Qt.Horizontal
model:12
delegate: Item{
ListView{
id:dayCalendar
orientation: Qt.Horizontal
model:32
delegate: Item{
...............
ListView{
id:daylistView
orientation: Qt.Vertical
model:24
delegate:Item{
id:hourItem
property string hourTime:hourweeklistviewLabel
property string notetaking:notesLabe
.............
MouseArea{
anchors.fill:parent
onClicked:{
windowLoader.active =true
daylistView.currentIndex=index
}
}
Rectangle{}
Label{
id:hourweeklistviewLabel
}
Label{
id:notesLabel
anchors.left:hourweeklistviewLabel.right
anchors.leftMargin: 30
text:""
}//Label
}//delegate:Item
}//ListView
} //delegate:Item
}//ListView
}//delegate:Item
}//Listview
}//Item
Ниже приведен код загрузчика:
Loader {
id:windowLoader
focus: true
active:false
sourceComponent: Window{
id:inputWin
title:"Enter Note"
width:500
height:300
visible:true
onClosing:{
windowLoader.active=false
monthofdayCalendar.currentItem.daycalendarAlias.currentItem.dayList.currentIndex = calendarMonth.selectedDate.getDate() === new Date().getDate()
amp;amp; calendarMonth.selectedDate.getDay() === new Date().getDay()
amp;amp; calendarMonth.selectedDate.getMonth() === new Date().getMonth()?getHour():12
}
TextField {
id:title
x:50
y:20
placeholderText :'Enter Note'
text:monthofdayCalendar.currentItem.daycalendarAlias.currentItem.dayList.currentItem.notetaking.text
}
TextField{
id:timeDate
anchors.horizontalCenter: title.horizontalCenter
anchors.top:title.bottom
anchors.topMargin:10
placeholderText : calendarMonth.selectedDate.getDate() "-"
(calendarMonth.selectedDate.getMonth() 1) "-"
calendarMonth.selectedDate.getFullYear() " "
monthofdayCalendar.currentItem.daycalendarAlias.currentItem.dayList.currentItem.hourTime.text
}
Button {
id: button
text: qsTr("Add Note")
anchors.centerIn:parent
onClicked: {
if (title.text !==""){monthofdayCalendar.currentItem.daycalendarAlias.currentItem.dayList.currentItem.notetaking.text= title.text}
else{}
}
}
}
}
The big question is how to save (store) the data of notesLabel.text
and be able to display it and restore it every time I close and re-open the application.
As you can see the model for each ListView
is not a ListModel
so I think I can not use those models to save the data if I am right.If I am wrong please advise.
Anyway your help will be appreciateed.
Редактировать
Я изменил целочисленные модели с ListModel
помощью динамически создаваемых.Код ListModel
s приведен ниже:
ListModel{
id:hourlistModel
Component.onCompleted:{
for (var i = 0; i <25; i ){
append(createListElement())
}
}
property int h:0
function createListElement(){
return {
hour : h
}
}
}
ListModel{
id:daylistModel
Component.onCompleted:{
for (var j=0; j <= 31; j ){
append(createListElement())
}
}
property int dD:0
function createListElement(){
return {
day : dD
}
}
}
ListModel{
id:monthlistModel
Component.onCompleted:{
for (var k=0; k <=11; k ){
append(createListElement())
}
}
property int mN:0
function createListElement(){
return {
monthName : mN
}
}
}
Могу ли я сохранить данные из Label
notesLabel, теперь я изменил модели ListView
s на ListModel
s?
Заранее спасибо.
Комментарии:
1. Вы правы, что не можете использовать целочисленные модели для сохранения данных таким образом. Для выполнения того, что вы хотите, требуется модель списка. Есть ли какая-то причина, по которой вы не хотите его использовать?
2. @fallerdNo, нет особой причины, кроме того, что я не знаю, как ее использовать в своем коде. Как сформировать
ListElement
s.
Ответ №1:
Я бы создал открытый класс C .
Используя открытый класс C , у вас есть целый ряд возможностей для передачи данных из передней/внутренней части
- Q_Property/Участник
- Q_Invokable
- Сигнал/Слоты
Учитывая, что вы используете строго строки, я бы использовал открытую серию QStrings или QStringList.
- QString
- QStringList
Чтобы приступить к чтению/записи файлов, используйте свой теперь открытый класс C . Вы можете либо придерживаться ввода-вывода файлов через стандартную систему c или QFile.
- Конструктор — Прочитайте файл .txt и сохраните данные в данных вашей собственности.
- Обменивайтесь данными по мере необходимости, обновляя элемент свойства QML или C
- Деконструктор — сохраните данные элемента свойства обратно в файл.
Краткий пример кода:
someQML.qml Импорт MyExposedClass 1.0
Item {
MyExposedClass {
id: myExposedClassID
text: myExposedClassID
}
Text{
id: yearTextID
text: myExposedClassID.year
}
Text{
id: monthTextID
text: myExposedClassID.month
}
Text{
id: dayTextID
text: myExposedClassID.day
}
Button {
id: myButtonID
onButtonPressed {
var finalStr = yearTextID monthTextID dayTextID
// If you used a QMember of qstring lets say
myExposedClassID.saveFile = finalStr
// If you used a QInvokable
myExposedClassID.saveFile_INVOK(finalStr)
}
}
}
MyClass.h
class myClass : public QObject {
Q_OBJECT
// Serial Dev
Q_PROPERTY(QString day READ getDay WRITE setDay NOTIFY dayChanged)
Q_PROPERTY(QString month READ ... WRITE ... NOTIFY ...)
Q_PROPERTY(QString year READ ... WRITE ... NOTIFY ...)
...
// On construction, read the text file and update the qproperty variables
//implement getters and setters for qproperties
// On deconstruction, write the properties to file
}
Если у вас возникли проблемы с MVC и QStrings/QStringList. Возможно, вам придется изучить кварианты или кабстраты.
Я нахожу QML рискованной дырой, в которую можно нырнуть. Его легко добавлять все больше и больше функций в файл QML. Но если вы попытаетесь перепроектировать его или изменить какую-то логику, это может очень быстро разрушить QML. Разделение QML на QML и C — хороший способ добиться модульности и контроля.