获取当前显示的委托的索引 - QML ListView

Posted

技术标签:

【中文标题】获取当前显示的委托的索引 - QML ListView【英文标题】:Get index of the delegate currently displayed - QML ListView 【发布时间】:2014-09-29 12:56:42 【问题描述】:

我创建了一个 ListView,它显示了用户定义的几页内容(纯文本)。显示的页面是一个委托。一次只能看到一页。我决定用它来捕捉一个项目,就像 ios 启动器的工作方式一样。用户只需在页面之间滑动即可。 (这是在触摸屏上使用的)

我需要有当前显示页面的索引才能进行某些操作。 ListView 的 currentIndex 始终保持 == 0。我怎样才能得到它?

对于喜欢代码的人:

 ListView
 
      onCurrentIndexChanged: console.log(currentIndex) // this gets called only once - at startup
      delegate: Column
      
           // The page displayed, only one page at a time
      
 

谢谢

【问题讨论】:

【参考方案1】:

有很多方法可以获取屏幕上显示的当前项目的索引。如果可以获取当前页面的x-y坐标,可以在ListView中使用indexAt方法。

并且在每个委托中,您可以在委托范围内使用index 角色找到索引。 index 就像您在模型中声明的角色,由 ListView 自动分配。例如,

ListView 

    delegate: Column
    
        property int indexOfThisDelegate: index
        //...
    

index角色介绍here:

代表也可以使用包含模型中项目索引的特殊索引角色。请注意,如果从模型中删除项目,则此索引设置为 -1...

另一种方法是显式地为 ListView 中的currentItem 属性赋值,这样视图就可以自己滚动了。这是 Qt 文档中的一个简单的example,与您的应用程序类似。

【讨论】:

即使我创建了int 属性,我也无能为力,因为我无法以编程方式读取该页面。我将不得不研究其他两个选项。 ObjectModel 示例没有说明 currentItem 糟糕,最后一个链接不包含完整的代码。您可以找到示例代码here。 有没有办法根据窗口中的x,y找出内容中的x,y?我总是知道当前项目在窗口中的哪个位置,但我不知道如何找出内容中当前页面的 x,y(如果我知道的话,我可以很容易地算术计算当前页面(它们都是大小相同)) 如果你的view只显示一个delegate,你可以试试ListView的contentX和contentY属性,继承自Flickable。 分配属性完全符合预期。在我的情况下,它归结为对所有事情都明确的强迫需要。只是到处写“index”而不是“itemId.currentIndex”让我的眼睛抽搐。【参考方案2】:

你可以这样做:

QModelIndex index =this->indexAt(event->pos());
        this ->setCurrentIndex(index);

【讨论】:

【参考方案3】:

您可以使用 ListView 类 (ListView) 的附加属性。它们附加到委托的每个实例。

参见 ListView.isCurrentItem 或 ListView.view 示例:

列表显示 宽度:180;身高:200 零件 id: 联系人代表 长方形 id: 包装 宽度:180 高度:contactInfo.height 颜色: ListView.isCurrentItem ? “黑红” 文本 id: 联系人信息 文字:姓名+“:”+号码 颜色: wrapper.ListView.isCurrentItem ? “红黑” 模型:ContactModel 代表:contactsDelegate 重点:真

【讨论】:

【参考方案4】:

我知道这已经很老了,但我遇到了同样的问题,并花了一些时间试图找到一种方法来获取适合我的 currentIndex。就我而言,有时我需要更改 ListView 的宽度,因此每次调整大小时都必须手动重新计算 currentIndex

但我找到了highlightRangeMode 属性。当它设置为ListView.StrictlyEnforceRange 时,currentIndex 总是自动更新并包含当前可见项的正确索引。

ListView 
    highlightRangeMode: ListView.StrictlyEnforceRange 
    // ...

【讨论】:

以上是关于获取当前显示的委托的索引 - QML ListView的主要内容,如果未能解决你的问题,请参考以下文章

QML PathView:通过鼠标滚轮更改路径视图的当前索引

如何从QML中的GridView或ListView获取实例化的委托组件

QML:如何在 Pathview 中获取当前项目

如何显示当前选择的 QML TreeView?

在可扩展的 QML 应用程序中访问列表视图索引

QML 使用中继器和委托,显示旧列表