最近在項目中使用到了 QML 的 TableView 因為需要動態調整每一個 Cell 大小。所以需要用到刷新。
直接看官方的例子:
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()
具體文檔可以點這裡
Calling this function re-evaluates the size and position of each visible row and column. This is needed if the functions assigned to rowHeightProvider or columnWidthProvider return different values than what is already assigned.
這裡說明了會重新計算高寬,但是細節就是 each visible row and column.,這導致不可見的 cell 不會重新計算。
結果就是 originX originY 會變得不可預期。
如果有任何其他控件使用 TableView 的 contentX, contentY ,那麼就無法正確計算。
因為 contentX 是根據 originX 計算的。
如何真正的全局刷新,刷新表格的全部。
-
TableView.forceLayout (): 只會刷新可視的界面
-
重設 visible:不會刷新
-
model 裡的 layoutChanged () 也只會刷新可視的界面
嘗試過 N 種方法後,解決方案:
重置 model,代碼如下,重置將 contentX 後重新移動到原來的位置。參照文檔實際上 TableView 只有 1fps,所以通常不會有什麼視覺上的影響。
Responding to changes in the model are batched so that they are handled only once per frame.
var firstIndex = table_view.contentX / (tableCellWidth);
table_view.model = null;
table_view.model = table_model;
table_view.contentX = (tableCellWidth) * firstIndex;