【问题标题】:QML - Retrieving index of delegate in DelegateModelQML - 在 DelegateModel 中检索委托的索引
【发布时间】:2017-04-18 14:43:09
【问题描述】:

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

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 中访问代理的正确索引?

【问题讨论】:

  • 您是否尝试过简单的index 而不是model.index
  • @Silex: index 只是model.index 的简写,不是吗?但是,如果您删除您的过滤功能,并打开filterOnGroup,您将得到正确的model.index。但我还是不明白你的功能。 Maybe this helps you。但如果您只想过滤和/或排序,您可能需要使用性能更高的QSortFilterProxyModel。它的基本功能很容易暴露。一个不错的 QML FilterModel 是这样的:github.com/oKcerG/SortFilterProxyModel
  • model.index 和 index 是等价的。因为我稍后会有一个 c++ 模型,所以我想用 QML 中的一些虚拟数据创建一个原型。但似乎我必须立即跳入 QSortFilterProxyModel。 @derM 您的链接已经是此实现的基础。该函数只是清空“项目”并将相关条目添加到“最近”组。它运作良好,但我无法获得该组中条目的索引。
  • link 文档写道:“代表也可以使用包含模型中项目索引的特殊索引角色。请注意,如果项目被删除,则此索引设置为 -1该模型。”那么从项目中删除是问题吗?并且再次插入后没有设置索引吗?
  • 我认为一开始的删除也可能是问题所在。但是注释掉那条特定的行并没有帮助。

标签: qt listview delegates qml


【解决方案1】:

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

就像这样:

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

【讨论】:

    【解决方案2】:

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

    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");
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      DelegateModel 有一些关于组的隐藏魔法(它不是很明显,但它是 here )。对于您创建的每个组,DelegateModel 附加属性将收到两个新属性:&lt;group&gt;Indexin&lt;Group&gt;

      在您的情况下,这意味着您将获得以下属性:recentIndexinRecent(或在您自己的答案中:recenttrueIndexinRecenttrue)。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-29
        • 2020-09-19
        • 1970-01-01
        • 2015-09-30
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多