QML - 在DelegateModel中检索委托的索引

时间:2017-04-18 14:43:10

标签: qt listview delegates qml

我无法检索在 DelegateModel 中为 ListView 实例化的委托的索引。 最小的例子如下:

LastProcedures.qml

ListModel {
ListElement {
    procedure: "Liver Resection"
    surgeon: "Prof. Dr. Joyride"
    recent: true
    }
    ...
}

main.qml

ListView {
        id: list_lastProcedures
        model: displayDelegateModel
    }
DelegateModel {
    id: displayDelegateModel
    delegate: lastProceduresDelegate
    model: LastProcedures {}
    groups: [
                DelegateModelGroup {
                    includeByDefault: false
                    name: "recent"
                }
            ]
    filterOnGroup: "recent"
    Component.onCompleted: {
        var rowCount = model.count;
        items.remove(0,rowCount);
        for( var i = 0;i < rowCount;i++ ) {
            var entry = model.get(i);
                // Only the recent three
                if((entry.recent == true) && (items.count < 3)) {
                    items.insert(entry, "recent");
                }
            }
        }
    }
Component {
    id: lastProceduresDelegate
    Text{
        text: model.index
    }
}

文本索引始终打印-1。如果没有DelegateModel,它会在ListView中打印索引。如何在Listview中访问委托的正确索引?

3 个答案:

答案 0 :(得分:1)

我最终没有删除所有条目并将它们添加回组,而是删除不需要的条目。这使索引保持有效。 如果有人能够进一步解释这种行为,那就太好了。

DelegateModel {
    id: displayDelegateModel
    delegate: lastProceduresDelegate
    model: LastProcedures {}
    groups: [
                DelegateModelGroup {
                    includeByDefault: true
                    name: "recenttrue"
                }
            ]
    filterOnGroup: "recenttrue"
    Component.onCompleted: {
        for( var i = 0;i < items.count;i++ ) {
            var entry = items.get(i).model;
            // Only the recent
            if((entry.recent != true)) {
                items.removeGroups(i, 1, "recenttrue");
            }
        }
    }
}

答案 1 :(得分:0)

您可以使用“lastProceduresDelegate.DelegateModel.itemsIndex”代替“model.index”

就像这样:

Component {
    id: lastProceduresDelegate
    Text{
        text: lastProceduresDelegate.DelegateModel.itemsIndex
    }

答案 2 :(得分:0)

DelegateModel对于组具有一些隐藏的魔力(虽然不是很明显,但是它是here)。对于您创建的每个组,附加的DelegateModel属性将收到两个新属性:<group>Indexin<Group>

对于您而言,这意味着您将获得以下属性:recentIndexinRecent(或您自己的答案:recenttrueIndexinRecenttrue)。

我认为您想做的事情应该走recenttrue路线并起草Component,如下所示:

Component {
    id: lastProceduresDelegate
    Text {
        text: lastProceduresDelegate.DelegateModel.recenttrueIndex
    }
}