【问题标题】:Get index of the delegate currently displayed - QML ListView获取当前显示的委托的索引 - 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
      }
 }

谢谢

【问题讨论】:

    标签: qt list listview qml


    【解决方案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 
            // ...
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-03
          • 1970-01-01
          • 2017-01-21
          • 1970-01-01
          • 2019-09-25
          • 2012-02-20
          • 1970-01-01
          相关资源
          最近更新 更多