2016-12-30 11 views
1

私は垂直リストビューを持っています。アイテムをクリックすると、水平リストビューが表示されます。問題は、2番目のアイテムをクリックすると、2番目のアイテムが水平方向のリストビューに表示されるはずです。ここでは、私の実装です:Qt QMLリストビューpositionViewAtIndexが機能しない

main.qml

import QtQuick 2.7 
import QtQuick.Controls 2.0 
import QtQuick.Layouts 1.0 

ApplicationWindow { 
id: root 
visible: true 
width: 640 
height: 480 
title: qsTr("Hello World") 

StackView { 
    id: rootStackView 
    anchors.fill: parent 
    initialItem: verListView 

} 

VListview { 
    id: verListView 
    onListItemClicked: { 
     rootStackView.push(horListView) 
     horListView.init(index) 
    } 
} 

HListView { 
    id: horListView 
    visible: false 
} 
} 

VListview.qml

import QtQuick 2.0 
import QtQuick.Controls 2.0 
import QtQuick.Layouts 1.0 


Page { 
id: root 

signal listItemClicked(var index) 


ListView { 

    id: listView 
    anchors.fill: parent 
    Layout.fillWidth: true 

    model: ListModel { 
     ListElement { 
      name: "Bill Smith" 
      number: "555 3264" 
     } 
     ListElement { 
      name: "John Brown" 
      number: "555 8426" 
     } 
     ListElement { 
      name: "Sam Wise" 
      number: "555 0473" 
     } 
    } 

    delegate: Component { 
     id: contactDelegate 
     Item { 
      MouseArea { 
       anchors.fill: parent 
       onClicked: { 
        console.log("aaa") 
        root.listItemClicked(index) 
       } 
      } 
      width: listView.width; height: 40 
      Column { 
       Text { text: '<b>Name:</b> ' + name } 
       Text { text: '<b>Number:</b> ' + number } 
      } 
     } 
    } 
} 

} 

HListview.qml

import QtQuick 2.0 
import QtQuick.Controls 2.0 
import QtQuick.Layouts 1.0 


Page { 

function init(index) { 
    console.log(index) 
    horizontalListView.currentIndex = index; 
    horizontalListView.positionViewAtIndex(index, ListView.Beginning) 
} 

ListView { 
    id: horizontalListView 

    anchors.fill: parent 
    orientation: ListView.Horizontal 
    model: ListModel { 
     ListElement { 
      name: "Bill Smith" 
      number: "555 3264" 
     } 
     ListElement { 
      name: "John Brown" 
      number: "555 8426" 
     } 
     ListElement { 
      name: "Sam Wise" 
      number: "555 0473" 
     } 
    } 
    snapMode: ListView.SnapToItem 
    delegate: Component { 
     id: contactDelegate 
     Item { 

      width: horizontalListView.width; height: 40 
      Column { 
       Text { text: '<b>Name:</b> ' + name } 
       Text { text: '<b>Number:</b> ' + number } 
      } 
     } 
    } 
} 

} 

VerticalListView

Horizo​​ntalL istView

HListView

私は2番目と3番目の項目をクリックしていますが、それは常に最初の項目を表示します。誰もが問題に直面した?ありがとうございます。

+0

多くのアイテムがある場合は、期待通りに動作します。ビューを埋めるのに十分なアイテムがある場合にのみ、選択したアイテムがビューの上部に表示されます。最後の項目をビューの一番上にドラッグすると、ビュー境界から外れているために戻って戻ります – dtech

+0

3つの項目では不十分ですか?もしそうなら、私のプロジェクトモデルには60アイテムありますが、それでもまだ動作していないので、そうは思わないでしょう。 – nAkhmedov

+0

StackViewがまだビジー状態のときに 'positionViewAtIndex'を呼び出せないように見えます(http://doc.qt。 io/qt-5/qml-qtquick-controls2-stackview.html#busy-prop)(但し、Qt docはこれについて何も言及していません)。 Transitionが終了した後、 'horListView.init(index)'を呼び出すようにしてください。 – mcchu

答えて

1

が間違って設定されています。

HListview.qml

ListView { 
    id: horizontalListView 

    //  anchors.fill: parent 
    height: 40 <== fix the height 
    width: root.width <== width of the hview must be same size as that of root window. 
    orientation: ListView.Horizontal 
    ... 
} 

EDIT

説明:索引でビューを配置すると、ビューの最初または最後に表示される空きスペース、ビューの意志を起こした場合境界に位置すること。

+0

リストアイテムをクリックしなくても、アプリケーションの読み込み中にComponent.onCompletedが呼び出されます。第二に、あなたは常にポジション2にあるアイテムを表示します。 – nAkhmedov

+0

申し訳ありません。私はコードで練習していた以前のバージョンをコピーしている必要があります。答えを編集しました。 –

+0

大丈夫ですが、positionViewAtIndexメソッドを呼び出す必要がありますか? – nAkhmedov

関連する問題