调用forceLayout()后HorizontalHeaderView的TextInput文本错位问题求助
问题原因与解决方案
核心原因
你遇到的文本“串列”问题,本质是HorizontalHeaderView的委托复用机制导致的:
- 当调用
tableView.forceLayout()时,视图会触发重新布局,HorizontalHeaderView会回收、复用已创建的委托组件(即你写的带TextInput的Rectangle)。 - 你的TextInput文本仅存储在委托实例的本地状态中,没有和过滤数据
filterDictionary做绑定。当某个委托被重新分配给其他列时,原输入的文本会跟着委托实例“迁移”到新列,表现为文本乱跳。
解决方法
将TextInput的text属性与filterDictionary做双向绑定,让它始终对应当前列的过滤值,而非依赖委托实例的本地状态。修改filterHeader的TextInput部分代码:
TextInput { id: textInputDelegate anchors.fill: parent verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHLeft // 双向绑定:从filterDictionary读取当前列的过滤文本,输入时同步更新字典 text: filterDictionary[model.display] || "" onTextChanged: { if (text !== "") { filterDictionary[model.display] = text } else { delete filterDictionary[model.display] } } // 保留原有onAccepted、键盘事件、焦点处理等代码... }
关键细节说明
- 用
model.display明确绑定当前列的标识,避免列匹配歧义; - 替换
onTextEdited为onTextChanged,确保文本变化时实时同步到filterDictionary; - 委托复用时,TextInput会自动从
filterDictionary加载对应列的已有过滤文本,不会丢失数据。
内容的提问来源于stack exchange,提问作者shortnr
相关产品推荐
相关产品推荐

