cpp Qt Model不更新QML视图

时间:2017-04-07 07:55:16

标签: c++ qt qml qtquick2

我正在为 QML视图使用自定义模型,我希望能够通过拖放来移动项目。 我在cpp模型中使用一个列表来设置Data,然后我将我的模型绑定到QML view

但是,当我将项目放入新位置时,视图要求模型将项目移动为新位置。 为此,我只使用函数dataList.move(oldIndexPosition, newIndexPosition) 更新我的dataList 我的dataList已正确更新,但未刷新QML视图。 我尝试使用信号emit dataChanged(),但仍然没有刷新视图

我不明白我该怎么办,有什么建议吗?

这是我尝试做的一个简单示例。请注意,这里没有拖放,以便更容易理解:

public:
    Q_INVOKABLE void move(int oldIndex, int newIndex) {
              dataList.move(oldIndex,newIndex);
              emit dataChanged(this->index(oldIndex),this->index(newIndex));
    }

signals:
    void dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight);

model.h

int main(int argc, char ** argv)
{
    QGuiApplication app(argc, argv);

    Model model;
    model.addSomeData("data1");
    model.addSomeData("data2");
    model.addSomeData("data3");

    QQuickView view;
    view.setResizeMode(QQuickView::SizeRootObjectToView);
    QQmlContext *ctxt = view.rootContext();
    ctxt->setContextProperty("myModel", &model);

    view.setSource(QUrl("qrc:view.qml"));
    view.show();

    return app.exec();
}

的main.cpp

ListView {
    width: 200; height: 250

    model: myModel
    delegate: Text { text: "data " + data  }

    MouseArea {
        anchors.fill: parent
        cursorShape: Qt.PointingHandCursor
        onClicked: {
            myModel.move(0,2) //Just a test
        }
    }
}

myqml.qml

如果您对我做错了什么有任何想法,那真的很有帮助我!非常感谢你。

1 个答案:

答案 0 :(得分:4)

我认为ModelQAbstractItemModel的实现。在这种情况下,您应该在开始移动数据之前致电QAbstractItemModel::beginMoveRows,然后QAbstractItemModel::endMoveRows完成确认。

Q_INVOKABLE void move(int oldIndex, int newIndex) {
    QModelIndex parent;
    beginMoveRows(parent, oldIndex, oldIndex, parent, newIndex);
    dataList.move(oldIndex,newIndex);
    endMoveRows();
}