2014-07-15 36 views
0

我在QML项目中有两个ListView,它们都运行在同一模型中。我试图让他们从不同的指数开始(模型以2 ListElement s开头)。为了做到这一点,我打电话positionViewAtIndex当该组件完成:ListView positionViewAtIndex()不起作用

ListView { 
    model: mymodel 
    Component.onCompleted: positionViewAtIndex(1,ListView.Beginning) 
    //... 
} 

然而,无论ListView实际上被定位在所需的索引。有没有我没有做的事情?我已经看到这个问题的唯一解决方案是确保您在ListView完成之前不会调用该方法,但我正在这样做。

我正在使用Qt 5.2/QtQuick 2.0。

编辑:在玩过其他定位器函数后,我发现它们都没有工作。我也发现改变currentIndex也不起作用。此外,我发现currentIndex没有被改变的观点 - onCurrentIndexChanged从未被解雇。

回答

0

所以,我想通了。事实证明,ListView实例化它的代表之前,它担心自己的属性......所以代表只读ListView的宽度,然后ListView设置其自己的尺寸。当委托在视图的方向上具有宽度/高度属性等于零时,当调用positionViewAtIndex()时,视图将不知道滚动到哪里。因此,为了解决这个问题,你必须使用一个条件约束:

Component { 
    id: myDelegate 
    Item { 
     width: ListView.view.width == 0 ? 480 /*or some preset*/ : ListView.view.width 
    } 
} 

这会给委托非零宽度,并导致positionViewAtIndex()功能工作。

当然,如果你的ListView是垂直的,那么你需要设置height属性而不是width属性。

0

或者,你可以设置currentIndex为1

+0

正如我在我的问题中指出的(在我编辑它之后),更改'currentIndex'完全没有。此外,手动更改视图的位置不会触发'onCurrentIndexChanged'信号... – hal7df

+0

使用qtquick 1.1进行快速测试后,只有在将ListView高度设置为小于视口所需的高度时才起作用。 CurrentIndexChanged信号将起作用,如果你打开突出显示 – nib

+0

这些都不适合我...我应该指出 - 我正在使用QtQuick 2.0(Qt 5.2),但我不认为这将是问题的原因。 – hal7df