我正在为 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
如果您对我做错了什么有任何想法,那真的很有帮助我!非常感谢你。
答案 0 :(得分:4)
我认为Model
是QAbstractItemModel
的实现。在这种情况下,您应该在开始移动数据之前致电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();
}