Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QML:GridView在C+;中更改其模型后不会更新+;_C++_Qt_Qml - Fatal编程技术网

C++ QML:GridView在C+;中更改其模型后不会更新+;

C++ QML:GridView在C+;中更改其模型后不会更新+;,c++,qt,qml,C++,Qt,Qml,我的出发点是以下QML源代码,其中GridView显示了ListModel,其中包含项目交换的漂亮动画: import QtQuick 1.1 GridView { id: mainGrid width: 825; height: 400; cellWidth: 165; cellHeight: 95 model: myModel delegate: myButton ListModel { id: myModel func

我的出发点是以下QML源代码,其中GridView显示了ListModel,其中包含项目交换的漂亮动画:

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()
                    }
                }
            }
        }
    }
}
导入QtQuick 1.1
网格视图{
id:主栅格
宽度:825;高度:400;单元宽度:165;单元高度:95
型号:myModel
代表:我的按钮
列表模型{
id:myModel
函数createModel(){

对于(var i=1;i我找到了解决方案。这是工作代码(感谢Borut123的建议)

class MyTable:公共QStandardItemModel
{
私人:
Q_对象
公众:
显式MyTable(QObject*parent=0):QStandardItemModel(parent){}
Q_可调用的void createModel();
Q_可调用void moveItem(int inx1,int inx2);
Q_可调用的void listItems();
};
void MyTable::createModel()
{
for(unsigned int i=0;i inx2)ok=beginMoveRows(QModelIndex(),inx1,inx1,QModelIndex(),inx2);
如果(!ok)返回;
QStandardItem*tmp1=takeItem(inx1);
if(inx1)为什么我不能使用简单的“insertRow(inx2,takeItem(inx1))”来代替循环。我得到了错误的模型,程序中断(代码0)。
#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);
};
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);
    }
}
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();
    }
}