2012-09-04 112 views
3

我的出發點是下面的QML源,在GridView控件顯示與項目互換的漂亮的動畫的ListModel:QML:GridView控件不更新後更改它的模型在C++

import QtQuick 1.1 
GridView { 
    id: mainGrid 
    width: 825; height: 400; cellWidth: 165; cellHeight: 95 
    model: myModel 
    delegate: myButton 
    ListModel { 
     id: myModel 
     function createModel() { 
      for (var i=1; i<=20; i++) { 
       append({"display":i}) 
      } 
     } 
     function listItems() { 
      console.log("LIST OF ITEMS") 
      for (var i=0; i<=19; i++) { 
       console.log("model["+i+"]="+get(i).display) 
      } 
     } 
     function moveItem(inx1,inx2) { 
      move(inx1,inx2,1) 
     } 
     Component.onCompleted: { 
      createModel() 
      listItems() 
     } 
    } 
    Component { 
     id: myButton 
     Item { 
      id: item 
      width: 160; height: 90 
      Rectangle { 
       id: box 
       parent: mainGrid 
       x: item.x; y: item.y; width: item.width; height: item.height; border.width: 1 
       Behavior on x {NumberAnimation { duration: 1000;} } 
       Behavior on y {NumberAnimation { duration: 1000;} } 
       Text { 
        anchors.centerIn: parent 
        text: display 
       } 
       MouseArea { 
        anchors.fill: parent 
        onClicked: { 
         mainGrid.model.moveItem(index,0) 
         mainGrid.model.listItems() 
        } 
       } 
      } 
     } 
    } 
} 

相反QML的ListModel我想使用其從QStandardItemModel衍生的C++模型:

#include <QStandardItemModel> 
class MyTable : public QStandardItemModel 
{ 
private: 
    Q_OBJECT 
    int table[20]; 
public: 
    explicit MyTable(QObject *parent = 0) : QStandardItemModel(parent) {} 
    Q_INVOKABLE void createModel(); 
    Q_INVOKABLE void moveItem(int inx1, int inx2); 
}; 

這個模型是通過qmlRegisterType<MyTable,1>("MyTable",1,0,"MyTable")暴露於QML。 問題是,我沒有得到很好的動畫效果,我也不確定交換後模型是否正確更新。

的相關(問題)的C++函數在這裏:

void MyTable::createModel() 
{ 
    for (unsigned int i=0; i<20; i++) { 
     table[i]=i; 
     QStandardItem* item = new QStandardItem(QString("%1").arg(table[i])); 
     appendRow(item); 
    } 
} 

void MyTable::moveItem(int inx1, int inx2) { 
    //SOME MATH, IT WORKS 
    int tmp = table[inx1]; 
    if (inx1<inx2) { 
     for (int i=inx1; i<inx2; i++) table[i] = table[i+1]; 
     table[inx2] = tmp; 
    } else if (inx2<inx1) { 
     for (int i=inx1; i>inx2; i--) table[i] = table[i-1]; 
     table[inx2] = tmp; 
    } 
    //UPDATE MODEL - IS SOMETHING MISSING HERE? 
    for (unsigned int i=0; i<20; i++) { 
     QStandardItem* item = new QStandardItem(QString("%1").arg(table[i])); 
     setItem(i,0,item); 
    } 
} 

回答

2

我找到了解決辦法。這是工作代碼(感謝Borut123的建議)。

class MyTable : public QStandardItemModel 
{ 
private: 
    Q_OBJECT 
public: 
    explicit MyTable(QObject *parent = 0) : QStandardItemModel(parent) {} 
    Q_INVOKABLE void createModel(); 
    Q_INVOKABLE void moveItem(int inx1, int inx2); 
    Q_INVOKABLE void listItems(); 
}; 

void MyTable::createModel() 
{ 
    for (unsigned int i=0; i<20; i++) { 
     QStandardItem* item = new QStandardItem(QString("%1").arg(i)); 
     appendRow(item); 
    } 
} 

void MyTable::moveItem(int inx1, int inx2) { 
    bool ok = false; 
    if (inx1 < inx2) ok = beginMoveRows(QModelIndex(),inx1,inx1,QModelIndex(),inx2+1); 
    if (inx1 > inx2) ok = beginMoveRows(QModelIndex(),inx1,inx1,QModelIndex(),inx2); 
    if (!ok) return; 
    QStandardItem* tmp1 = takeItem(inx1); 
    if (inx1<inx2) { 
     for (int i=inx1; i<inx2; i++) { 
      QStandardItem* tmp2 = takeItem(i+1); 
      setItem(i,tmp2); 
     } 
    } else if (inx2<inx1) { 
     for (int i=inx1; i>inx2; i--) { 
      QStandardItem* tmp2 = takeItem(i-1); 
      setItem(i,tmp2); 
     } 
    } 
    setItem(inx2,tmp1); 
    endMoveRows(); 
} 

void MyTable::listItems() { 
    qDebug() << "LIST OF ITEMS"; 
    for (unsigned int i=0; i<20; i++) { 
     qDebug() << QString("table[%1]=%2").arg(i).arg(item(i)->text()).toAscii().data(); 
    } 
} 
+0

爲什麼我不能使用簡單的「insertRow(inx2,takeItem(inx1))」而不是那個循環。我得到不正確的模型,程序中斷(代碼0)。 – meolic

相關問題