2013-10-09 4 views
5

wieder gut ich habe eine Frage (und vielleicht ein Problem), ich ein Programm mit qt und qml in qt5 und qml mit qtquick 2.0, und ich habe eine C++ - Modell qlist, und ich brauche die Liste im laufenden Betrieb ändern, ich benutze q QQmlListProperty und zeigt die Elemente in QML, aber sie sind nicht verstecken und zeigen in dem Moment, wenn ich hinzufügen oder entfernen, mein Code nächsten:Verwenden QQmlListProperty zu zeigen und zu ändern QList in Qml

class ConceptsList: public QObject{ 

Q_OBJECT 
Q_PROPERTY(QQmlListProperty<Concept> concepts READ concepts NOTIFY conceptsChanged) 
Q_CLASSINFO("DefaultProperty", "concepts") 

public: 
    ConceptsList(QObject *parent=0); 

    QQmlListProperty<Concept> concepts(); 
    Q_INVOKABLE static void append_concept(QQmlListProperty<Concept> *list, Concept *cpt); 

    Q_INVOKABLE void removeConcept(int index); 
    Q_INVOKABLE void addConcept(QString m_id,QString description, QString quantity, QString price, QString unit, QString total); 

    Q_INVOKABLE int countConcepts(); 

    static void clearConcepts(QQmlListProperty<Concept> *property); 
    static int conceptsSize(QQmlListProperty<Concept> *property); 
    static Concept *conceptAt(QQmlListProperty<Concept> *property, int index); 

signals: 
    void conceptsChanged(); 

private: 
    QList<Concept *> m_concepts; 
} 

ich verwende listview und delegate und ich habe keine Probleme zu sehen, aber meine Frage ist, ob ich eine QQmlListProperty verwenden und die Qlist ändern kann, oder ich werde ein Formular ändern, um qlist qml zu offenbaren, wenn es möglich ist, wie die Methode von qml aufrufen, oder wie in C++ implementieren, frage ich, weil es wirklich wenig Zahl oder Beispiele mit Arbeit th gibt ist Form. in qml mein Code nächste:

ConceptsList{ 
     id:cpts 
     concepts:[ 
      Concept{ 
       m_id:"7" 
       m_quantity: "3" 
       m_price: "1" 
       m_unit:"1" 
       m_description:"algo" 
       m_total:"2" 
      } 
     ] 
    } 

    ListView { 
      id: listConceptsView 
      objectName: "list" 
      anchors.fill: parent 
      anchors.margins: 5 
      clip: true 
      focus: true 
      highlight: highlightBar 
      highlightFollowsCurrentItem: false 


      Component{ 
       id: tableConceptDelegate 

       Item{ 
        anchors.margins: 4 
        width: 515 
        height: 27 
        clip: true 

        Row { 
         spacing: 4 

         Text { 
          height: 26; width: 76 
          text: model.m_id 
          color: "black" 
          font.bold: true 
          horizontalAlignment: Text.AlignHCenter 
         } 
         ... 

         ... 

         Text { 
          height: 26; width: 120 
          text: model.m_total//amountTotal 
          color: "black" 
          font.bold: true 
          horizontalAlignment: Text.AlignHCenter 
         } 
        } 

        MouseArea { 
         id: mouse_area1 
         anchors.fill: parent 
         onClicked: 
         { 
          listConceptsView.currentIndex = index 
         } 
        } 
       } 

      } 

      delegate: tableConceptDelegate 
      model:cptCpt // i define this alias how cptCpt: cpt.concepts 
     } 

Antwort

5

bekam ich die Antwort für mich selbst, zuerst, ich hielt das Attribut Q_INVOCABLE in dem Verfahren append_concept mit, zweitens, ich eine Zeile Code in der Umsetzung von addConcept hinzugefügt. Hier ist der Code:

Vorher:

Q_INVOKABLE static void append_concept(QQmlListProperty<Concept> *list, Concept *cpt); 

Jetzt:

static void append_concept(QQmlListProperty<Concept> *list, Concept *cpt); 

Vielleicht nicht beeinflussen, aber ich ziehe es kein Risiko ein.

Und in den Implementierungen von addConcept und removeConcept:

void ConceptsList::addConcept(QString m_id, QString quantity, QString price, QString unit, QString description) 
{ 
    Concept *cpt=new Concept(m_id, quantity, unit, price, description); 

    m_concepts.append(cpt); 
    this->conceptsChanged(); 
} 

void ConceptsList::removeConcept(int index) 
{ 
    m_concepts.removeAt(index); 
    this->conceptsChanged(); 
} 
+0

als Kommentar dies gilt nur, wenn die Liste ausgesetzt ist, alle jedes Mal geändert (zum Beispiel dieser Liste alle mit einem HTTP-Anfrage bekommen geändert), oder wenn posible Laden Sie die gesamte Liste erneut, ohne dass sich dies auf den Ablauf des Programms auswirkt. – APRocha

+0

append_concept (QQmlListProperty * Liste, Concept * cpt) sollte einen Fehler auslösen, sollte nicht vom Typ QQmlListProperty sein ? –

Verwandte Themen