gpt4 book ai didi

qt - QML:原始模型中的动态 View 重新排序

转载 作者:行者123 更新时间:2023-12-04 10:49:53 25 4
gpt4 key购买 nike

使用此 Qt 教程通过拖动 View 项实现 QML 动态 View 排序:QML Dynamic View Ordering Tutorial .原始底层模型是 QAbstractListModel在我们的例子中是后代。模型将数据存储在 QList<QObject*> objectList; 中字段类型。工作正常,但是代理中的项目排序发生了变化 DelegateModel只要。

如何自动更改原始基础模型中的项目顺序以及其他顺序很重要的 C++ 和 QML 消费者?或者我可以以其他方式从 C++ 以某种方式访问​​一些结果(排序的)List Model 模型吗?

感谢您的帮助!

最佳答案

QML Dynamic View Ordering Tutorial 3我用我的 ObjectListModel::move() 方法替换了 visualModel.items.move() 调用,如下所示:

ObjectListModel : public QAbstractListModel:

void ObjectListModel::move(int from, int to)
{
if(0 <= from && from < count() && 0 <= to && to < count() && from != to) {
if(from == to - 1) // Allow item moving to the bottom
to = from++;

beginMoveRows(QModelIndex(), from, from, QModelIndex(), to);
objectList.move(from, to);
endMoveRows();
}
}

委托(delegate)组件:

DropArea {
anchors { fill: parent; }

onEntered: {
let from = drag.source.DelegateModel.itemsIndex
let to = mouseArea.DelegateModel.itemsIndex
objectListModel.move(from, to)
}
}

上面的内容对于 ListViewObjectListModel 本身非常有效 - 我已经检查过:项目(以及对象)移动正确,索引正确,C++ 消费者工作正常很好,并正确考虑新订单等。


然而,在 beginMoveRows/endMoveRows 调用之后,另一个像 MapItemView 这样的消费者无法使用该模型:移动的项目在 map 上消失了,其他操作一个项目使应用程序崩溃。

 Map {
...
MapItemView {
model: objectListModel

delegate: SomeItemIndicator {
}
}
}

已报告QTBUG-81076错误,已确认。

解决方法:

目前已找到解决方法:创建了第二个重复模型,每次添加/删除/移动(重新排序)时,第一个模型的每次更改都会完全替换其内容。以上工作因为 beginResetModel/endResetModelMapItemView 正常工作。所以 MapItemView 现在只使用第二个模型。因此,在每次第一个模型更改时,都会为第二个模型调用此方法:

QObjectList ObjectListModel::swapObjectList(const QObjectList& newlist)
{
QObjectList oldlist(_objectList);
beginResetModel();
_objectList = newlist;
endResetModel();
return oldlist;
}

关于qt - QML:原始模型中的动态 View 重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59537237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com