Zeke Xiao

Zeke Xiao

github

QtQuick/QML中のTableViewのcolumnWidthとrowHeightの変更に関する問題

最近、プロジェクトで 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 に基づいて計算されるからです。

テーブル全体を本当にリフレッシュする方法は次のとおりです。

  1. TableView.forceLayout (): 表示されている部分のみをリフレッシュします。

  2. visible をリセットする:リフレッシュされません。

  3. 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;
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。