qt - TableView 中的 QML 和组合框
问题描述
我正在尝试在 TableView 中设计一个带有组合框的移动应用程序。
import QtQuick 2.9
import QtQuick.Controls 2.2
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
import QtQuick.Controls 1.2
import QtQuick.Window 2.0
import QtLocation 5.6
import QtPositioning 5.6
import QtQuick.Controls.Styles 1.2
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Scroll")
Component.onCompleted: {
var i=0;
for(;i<50;i++)
{
console.log("ApplicationWindow.onCompleted");
var myBoject = {"text":"Banana"};
idListModelForFlightToExport.append(myBoject);
}
}
ListModel {
id: idListModelForFlightToExport
}
Component {
id: checkBoxDelegate
ComboBox {
anchors.fill: parent;
model: [ {"text":"Banana"}, {"text":"Apple"}, {"text":"Coconut"} ]
textRole: "text";
Component.onCompleted: {
console.log("checkBoxDelegate.onCompleted");
}
}
}
TableView {
id: idTableViewFlightsToExport
sortIndicatorVisible: false
model: idListModelForFlightToExport
anchors.fill: parent
TableViewColumn {
id: isExportedColumn
title: qsTr("Column")
movable: false
resizable: false
delegate:checkBoxDelegate
}
}
}
但是当我更改组合框的值,然后向下滚动时,其他一些组合框会更改它们的值。
即,如果我更改第一个组合并滚动,则第一个组合的值将显示在另一个组合上(似乎是随机选择的),并且第一个组合似乎被重置。如果我再次滚动,另一个组合会改变值。
解决方案
这是因为当您滚动时,会TableView
回收委托,而不是销毁看不见的委托并重新创建将要显示的委托。这有助于性能。在您的情况下,当委托被 TableView 打乱时,您的状态会被保留。
您不应将状态存储在委托中,而应将其存储在外部。
您可以在此处阅读更多相关信息:https ://doc.qt.io/qt-5/qml-qtquick-tableview.html#reusing-items
推荐阅读
- python - AttributeError:“会话”对象没有属性“merge_environment_settings”
- javascript - 如何使用 uglifyjs-webpack 将源文件 (Javascript) 缩小为缩小文件
- oracle - Oracle 段空间
- mysql - 更新 sql 以仅在日期时间中更改时间
- r - 用行替换缺失值意味着如果每行恰好有 N 个缺失值
- sql - 计算多个聚合值并在 1 列中计算它们的最终总和
- javascript - 显示文本框多行值
- java - ImageView 位图偏移校正
- python - 如何对句子中的一个特定单词进行分类?
- javascript - JS函数被调用但没有结果