【问题标题】:cpp Qt Model not updating QML viewcpp Qt模型不更新QML视图
【发布时间】:2017-04-09 00:33:07
【问题描述】:

我正在为我的 QML 视图 使用自定义模型,并且我希望能够通过拖放来移动项目。 我在我的 cpp 模型中使用一个列表来设置数据,然后我将我的模型绑定到 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

如果您对我做错了什么有任何想法,那您能帮助我真是太好了!非常感谢。

【问题讨论】:

标签: c++ qt qml qtquick2


【解决方案1】:

我假设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();
}

【讨论】:

  • 我猜您的意思是开始移动行,而不是示例中的列。
  • 非常感谢,我目前不在工作,但这是我需要的,我会尽快检查!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 2021-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多