2017-10-13 1 views
0

J'ai un QML qui représentent le calendrier, qui obtiennent des valeurs de la base de données, donc j'ai besoin d'insérer des valeurs à ListModel à partir de mon code python. QML ressemble à ça:Définir les éléments à QML ListModel dynamicaly avec PyQt

function append(newElement) { 
    scheduleList.model.append(newElement) 
} 

ListView { 
    id: scheduleList 
    model: scheduleModel 
    delegate: scheduleItem 

    section.property: "day" 
    section.delegate: sectionDelegate 
} 

Component { 
    id: scheduleItem 
    Rectangle { 
     Row { 
      spacing: 15 
      Text { 
       text: lesson 
      } 
      Text { 
       text: subject 
      } 
     } 
    } 
} 

Component { 
    id: sectionDelegate 
    Rectangle { 
     id: root 
     Text { 
      id: label 
      text: section 
     } 
    } 
} 

Je fonction, qui devrait insérer des valeurs à QML ListModel:

class ScheduleView(QObject): 
    def __init__(self, parent=None): 
     QObject.__init__(self, parent=parent) 
     self._presenter = SchedulePresenter(self) 
     self._widget = QQuickWidget(parent) 
     self._widget.rootContext().setContextProperty('scheduleView', self) 
     self._widget.rootContext().setContextProperty('groupsModel', self) 
     self._widget.setSource(QUrl('modules/schedule/Form.qml')) 

def reprSchedules(self): 
    values = [{"lesson": "1", "subject": "PE", "day": "Monday"}, 
       {"lesson": "2", "subject": "PE", "day": "Monday"}, 
       {"lesson": "3", "subject": "PE", "day": "Monday"}] 
    #model = self._widget.rootObject().findChild(QObject, "scheduleModel") 

Je n'ai pas idée comment faire cela. Pourrais-tu m'aider s'il te plait? J'utilise python2.7, PyQt5.9, QtQuick2.5

Répondre

1

Pour cette tâche, vous pouvez appeler la fonction append que vous avez mis en œuvre dans le .qml par QMetaObject.invokeMethod() comme indiqué ci-dessous:

main.py

counter = 0 

def onTimeout(obj): 
    global counter 
    value = {"lesson": str(counter), "subject": "PE", "day": QDate.longDayName(1 + counter % 7)} 
    QMetaObject.invokeMethod(obj, "append", Q_ARG(QVariant, value)) 
    counter += 1 


if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    w = QQuickWidget() 
    w.setSource(QUrl('main.qml')) 
    timer = QTimer() 
    timer.timeout.connect(lambda: onTimeout(w.rootObject())) 
    timer.start(1000) 
    w.show() 
    sys.exit(app.exec_()) 

main.qml

import QtQuick 2.0 

Rectangle { 
    width: 640 
    height: 480 

    function append(newElement) { 
     scheduleModel.append(newElement) 
    } 
    ListModel { 
     id: scheduleModel 
    } 

    ListView { 
     anchors.fill: parent 
     id: scheduleList 
     model: scheduleModel 
     delegate: scheduleItem 

     section.property: "day" 
     section.delegate: sectionDelegate 
    } 


    Component { 
     id: scheduleItem 
      Row { 
       spacing: 15 
       Text { 
        text: lesson 
       } 
       Text { 
        text: subject 
       } 
     } 
    } 

    Component { 
     id: sectionDelegate 
      Text { 
       id: label 
       text: section 
      } 
    } 
} 

Le co Exemple mplete peut être trouvé à l'adresse suivante link