Как сохранить данные вложенного представления списка и извлечь их после , без модели списка в qml

#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.

  1. Конструктор — Прочитайте файл .txt и сохраните данные в данных вашей собственности.
  2. Обменивайтесь данными по мере необходимости, обновляя элемент свойства QML или C
  3. Деконструктор — сохраните данные элемента свойства обратно в файл.

Краткий пример кода:

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 — хороший способ добиться модульности и контроля.