2013-10-09 13 views
5

một lần nữa, tôi có một câu hỏi (và có thể là một vấn đề), tôi làm một chương trình với qt và qml trong qt5 và qml với qtquick 2.0, và tôi có một mô hình C++ qlist, và tôi cần phải sửa đổi các danh sách trong thời gian chạy, tôi sử dụng q QQmlListProperty và hiển thị các mục trong QML, nhưng họ không che giấu và hiển thị trong thời điểm này khi tôi thêm hoặc loại bỏ mã của tôi là tiếp theo:Sử dụng QQmlListProperty để hiển thị và sửa đổi QList trong 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; 
} 

tôi sử dụng một listview và delegate và tôi không có vấn đề gì để xem, nhưng câu hỏi của tôi là nếu tôi có thể sử dụng QQmlListProperty và sửa đổi Qlist, hoặc tôi sẽ thay đổi biểu mẫu để hiển thị qlist thành qml, nếu có thể gọi phương thức từ qml hoặc cách thực hiện trong C++, tôi hỏi vì tồn tại rất ít số hoặc ví dụ với công việc là hình thức. trong QML mã của tôi là tiếp theo:

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 
     } 

Trả lời

5

tôi có câu trả lời cho bản thân tôi, đầu tiên, tôi đã ngừng sử dụng các thuộc tính Q_INVOCABLE trong phương pháp append_concept, thứ hai, tôi đã thêm một dòng mã trong việc thực hiện addConcept. Đây là mã:

Trước:

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

Bây giờ là:

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

Có lẽ đây không ảnh hưởng, nhưng tôi không thích chấp nhận rủi ro.

Và trong việc triển khai của addConceptremoveConcept:

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

như nhận xét này chỉ áp dụng khi danh sách tiếp xúc được thay đổi tất cả mọi thời gian (ví dụ danh sách này đã thay đổi tất cả với một http được yêu cầu) hoặc khi là posible tải lại tất cả danh sách mà không có hậu quả cho luồng chương trình. – APRocha

+0

append_concept (danh sách QQmlListProperty *, Khái niệm * cpt) nên ném một lỗi, không nên thuộc loại QQmlListProperty ? –

Các vấn đề liên quan