最近、プロジェクトで QML の TableView を使用しています。各セルのサイズを動的に調整する必要があるため、更新が必要です。
公式の例を直接見てみましょう:
import QtQuick 2.12
import TableModel 0.1
TableView {
anchors.fill: parent
columnSpacing: 1
rowSpacing: 1
clip: true
model: TableModel {}
delegate: Rectangle {
implicitWidth: 100
implicitHeight: 50
Text {
text: display
}
}
}
サイズを動的に調整する場合は、TableView の下に次のコードを追加する必要があります。
rowHeightProvider: function (row) {
return xxxWidth;
}
そして、forceLayout()
を使用します。具体的なドキュメントはこちらを参照してください。
この関数を呼び出すと、各表示されている行と列のサイズと位置が再評価されます。これは、rowHeightProvider または columnWidthProvider に割り当てられた関数が、既に割り当てられている値と異なる値を返す場合に必要です。
ここでは、高さと幅が再計算されることが説明されていますが、詳細は each visible row and column. です。これにより、非表示のセルは再計算されません。
結果として、originX と originY は予測できない値になります。
TableView の contentX, contentY を使用する他のコントロールがある場合、正しく計算できません。
なぜなら、contentX は originX に基づいて計算されるからです。
テーブル全体を本当にリフレッシュする方法は次のとおりです。
-
TableView.forceLayout (): 表示されている部分のみをリフレッシュします。
-
visible をリセットする:リフレッシュされません。
-
model の layoutChanged (): 表示されている部分のみをリフレッシュします。
さまざまな方法を試した後、解決策は次のとおりです。
モデルをリセットします。以下はコードです。リセットすると、contentX が元の位置に再配置されます。実際のドキュメントによると、TableView は通常 1fps しかありませんので、視覚的な影響はほとんどありません。
モデルの変更に対応するためには、1 フレームにつき 1 回だけ処理されるようにバッチ処理されます。
var firstIndex = table_view.contentX / (tableCellWidth);
table_view.model = null;
table_view.model = table_model;
table_view.contentX = (tableCellWidth) * firstIndex;