ユーザーが定義した数ページのコンテンツ(プレーンテキスト)を表示するListViewを作成しました。表示されるページはデリゲートです。一度に表示できるページは1つだけです。 iOSのランチャーが機能するのと同じように、これを使用して1つのアイテムにスナップすることにしました。ユーザーはページ間をフリックするだけです。 (これはタッチスクリーンで使用されます)
いくつかの操作のために、現在表示されているページのインデックスが必要です。 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
}
}
ありがとう
画面に表示されている現在のアイテムのインデックスを取得する方法はたくさんあります。現在のページのx-y座標を取得できる場合は、ListViewで indexAt メソッドを使用できます。
また、各デリゲートでは、デリゲートのスコープ内でindex
ロールを使用してインデックスを見つけることができます。 index
は、モデルで宣言した役割のようなものであり、ListViewによって自動的に割り当てられます。例えば、
ListView
{
delegate: Column
{
property int indexOfThisDelegate: index
//...
}
}
index
ロールが導入されました ここ :
モデル内のアイテムのインデックスを含む特別なインデックスロールもデリゲートで使用できます。アイテムがモデルから削除された場合、このインデックスは-1に設定されることに注意してください。
もう1つの方法は、ListViewのcurrentItem
プロパティに値を明示的に割り当てて、ビューがそれ自体でスクロールできるようにすることです。これは、Qtドキュメントの簡単な 例 です。これはアプリケーションに似ています。
私はこれがかなり古いことを知っていますが、私は同じ問題を抱えていて、私のために働くcurrentIndexを取得する方法を見つけるために時間を費やしています。私の場合、ListViewの幅を変更する必要があるため、毎回currentIndexを手動で再計算する必要がありました。
しかし、それから私は highlightRangeMode プロパティを見つけました。 ListView.StrictlyEnforceRange
に設定すると、currentIndexは常に自動的に更新され、現在表示されているアイテムの正しいインデックスが含まれます。
ListView {
highlightRangeMode: ListView.StrictlyEnforceRange
// ...
}
ListViewクラスの添付プロパティを使用できます( ListView )。それらはデリゲートの各インスタンスにアタッチされます。
ListView.isCurrentItemまたはListView.viewの例を参照してください。
ListView { 幅:180;高さ:200 コンポーネント{ id:contactsDelegate 長方形{ id:ラッパー 幅:180 高さ:contactInfo.height 色:ListView.isCurrentItem? "黒": "赤" テキスト{ id:contactInfo テキスト:名前+ ":" +番号 色:wrapper.ListView.isCurrentItem? "red": "black" } } } モデル:ContactModel {} デリゲート:contactsDelegate フォーカス:true }
あなたはそのようにすることができます:
QModelIndex index =this->indexAt(event->pos());
this ->setCurrentIndex(index);