Qt QML:两个gridview之间的共享列表模型

Qt QML:两个gridview之间的共享列表模型,qt,qml,Qt,Qml,我需要在两个gridview之间共享项目的模型列表,因为我需要使用拖放在两个控件之间移动项目。显而易见的解决方案是使用Package,但在我的例子中,我遇到了一个问题:如果项目放在另一个视图上,GridView会显示一个项目应该位于的空白区域。屏幕截图将使问题变得更为严重。如您所见,我通过在两个视图中处理偶数和奇数来添加块,但这会创建您可以看到的列。有人知道如何使块以“正常”顺序出现在视图中,而不带空格 遵循示例代码: GridView { id: grid1 cellWidt

我需要在两个gridview之间共享项目的模型列表,因为我需要使用拖放在两个控件之间移动项目。显而易见的解决方案是使用Package,但在我的例子中,我遇到了一个问题:如果项目放在另一个视图上,GridView会显示一个项目应该位于的空白区域。屏幕截图将使问题变得更为严重。如您所见,我通过在两个视图中处理偶数和奇数来添加块,但这会创建您可以看到的列。有人知道如何使块以“正常”顺序出现在视图中,而不带空格

遵循示例代码:

GridView {
    id: grid1
    cellWidth: 80
    cellHeight: 80
    model: visualDelegateModel.parts.grid1
}

GridView {
    id: grid2
    cellWidth: 80
    cellHeight: 80
    model: visualDelegateModel.parts.grid2
}

ListModel {
    id: blocksListModel
    ListElement { color: "blue" }
    ListElement { color: "green" }
    ListElement { color: "red" }
    ListElement { color: "yellow" }
    ListElement { color: "orange" }
    ListElement { color: "purple" }
    ListElement { color: "cyan" }
    ListElement { color: "magenta" }
    ListElement { color: "chartreuse" }
    ListElement { color: "aquamarine" }
    ListElement { color: "indigo" }
    ListElement { color: "black" }
    ListElement { color: "lightsteelblue" }
    ListElement { color: "violet" }
    ListElement { color: "grey" }
    ListElement { color: "springgreen" }
    ListElement { color: "salmon" }
    ListElement { color: "blanchedalmond" }
    ListElement { color: "forestgreen" }
    ListElement { color: "pink" }
    ListElement { color: "navy" }
    ListElement { color: "goldenrod" }
    ListElement { color: "crimson" }
    ListElement { color: "teal" }
}

DelegateModel {
    id: visualDelegateModel
    delegate: Block {}
    model: blocksListModel
}
这是块委托:

Package {
    id: packageRoot

    Item { id: grid1Delegate; Package.name: "grid1"}
    Item { id: grid2Delegate; Package.name: "grid2" }

    Rectangle {
        id: block
        width: 72; height: 72
        anchors {
            horizontalCenter: parent.horizontalCenter;
            verticalCenter: parent.verticalCenter
        }
        color: model.color
        radius: 3

        state: (index % 2) ? "grid1" : "grid2"

        states: [
            State {
                name: "grid1"
                ParentChange { target: block; parent: grid1Delegate }
            },
            State {
                name: "grid2"
                ParentChange { target: block; parent: grid2Delegate }
            }
        ]
    }
}

请提供详细信息,以描述该问题。GridView中缺少某些部分以获得与您相同的渲染器。您可以使用两个
QSortFilterProxyModel
将一个根模型拆分为两个模型,并使用一些条件来决定在何处显示它。若要移动它,您可以将模型条目移动到根模型中的正确位置,并可能设置一些要更改的角色,最终将在哪个模型中对其进行过滤。感谢您的建议,但该包仅用于创建单个模型,并允许在视图之间轻松移动项目。可以为每个视图创建两个模型而不是拆分,但在这种情况下,在视图之间移动项意味着从模型中删除项并附加到另一个模型,这不是我所需要的…通过更改Block By
Text{id:grid1Delegate;宽度:72;高度:72;Text:'Empty 1';Package.name:'grid1'}Text{id:grid2Delegate;宽度:72;高度:72;文本:'Empty 2';Package.name:'grid2'}
您将看到发生了什么。此外,如果您尝试显示
visualDelegateModel.parts.grid2.count
,您将获得
24
。您在这里没有真正的子模型。
只允许您为同一模型拥有不同的代理。它们还共享一个上下文,以便它们可以相互引用。那么,您需要什么呢您要做的是,为每个模型条目创建两个
和一个
矩形
。您将
矩形
重新分配到这两个项中的一个。然后在grid1中显示两个项中的第一个,在grid2中显示第二个。无论内容如何,它都会被添加并使用一个单元格。