滚动时我的列表视图中的这些故障是什么?
What are these glitches in my listview when scrolling?
我正在用 QT 为 Python 编写文件转换软件,您可以将文件拖到软件中,单击转换按钮,然后拖出输出文件。当用户将文件拖到软件中时,所有文件的名称都会添加到一个 ListView 中。
当用户将文件拖入 ListView 时,它会调用 backend.addToPaths(url)
函数,其中包含拖入其中的每个文件路径。然后此函数将所有文件路径附加到文件路径的内部列表中,然后更新列表视图,使用所有文件名调用 main.qml 文件中的 updateList (paths) 函数,这会清除列表视图,然后追加拖入的所有文件名、旧文件名和新文件名。
所有文件名都正确添加到列表视图中,但是当我在列表视图内部滚动时,它会产生这些非常奇怪的渲染错误,as shown in this video,或者在这些图像中:
图片 1:
图 2:
图 3:
一开始我以为可能是剪裁的问题,所以我把它去掉了,没有任何改变。然后我尝试增加 listview 的显示边距,然后是它的 cacheBuffer,但它仍然没有帮助。我也尝试将 pixelAligned 设置为 true,但仍然没有用。我猜这可能是因为 QT 不太擅长处理正在更新或更改的列表模型,但我真的不知道。
如果需要,这里是我的 main.qml
文件的简化版本:
ListView {
id: inputFileView
// @disable-check M16
objectName: "inputFileView"
clip: true
boundsBehavior: Flickable.StopAtBounds
flickableDirection: Flickable.VerticalFlick
displayMarginBeginning: 100
displayMarginEnd: 100
function updateList(paths) {
console.log("updating list");
inputFileModel.clear();
paths.forEach( function (item) {
inputFileModel.append({
'name': item
});
});
}
model: ListModel {
id: inputFileModel
}
delegate: Item {
Row {
id: row1
Text {
text: name
}
}
}
DropArea {
anchors.fill: parent
onDropped: {
drop.urls.forEach( function (url) {
backend.addToPaths(url)
});
}
}
}
我猜这是 PySide2 的错误?我注意到有人用 PySide2 标签替换了 Pyside 标签,我什至没有显示 python 代码来澄清我使用的是那个版本,所以我想知道这是否意味着问题只在PySide2,所以我从那个切换到 PySide6,它工作了。我不知道是什么原因造成的,但我想现在没问题了。
我正在用 QT 为 Python 编写文件转换软件,您可以将文件拖到软件中,单击转换按钮,然后拖出输出文件。当用户将文件拖到软件中时,所有文件的名称都会添加到一个 ListView 中。
当用户将文件拖入 ListView 时,它会调用 backend.addToPaths(url)
函数,其中包含拖入其中的每个文件路径。然后此函数将所有文件路径附加到文件路径的内部列表中,然后更新列表视图,使用所有文件名调用 main.qml 文件中的 updateList (paths) 函数,这会清除列表视图,然后追加拖入的所有文件名、旧文件名和新文件名。
所有文件名都正确添加到列表视图中,但是当我在列表视图内部滚动时,它会产生这些非常奇怪的渲染错误,as shown in this video,或者在这些图像中:
图片 1:
图 2:
图 3:
一开始我以为可能是剪裁的问题,所以我把它去掉了,没有任何改变。然后我尝试增加 listview 的显示边距,然后是它的 cacheBuffer,但它仍然没有帮助。我也尝试将 pixelAligned 设置为 true,但仍然没有用。我猜这可能是因为 QT 不太擅长处理正在更新或更改的列表模型,但我真的不知道。
如果需要,这里是我的 main.qml
文件的简化版本:
ListView {
id: inputFileView
// @disable-check M16
objectName: "inputFileView"
clip: true
boundsBehavior: Flickable.StopAtBounds
flickableDirection: Flickable.VerticalFlick
displayMarginBeginning: 100
displayMarginEnd: 100
function updateList(paths) {
console.log("updating list");
inputFileModel.clear();
paths.forEach( function (item) {
inputFileModel.append({
'name': item
});
});
}
model: ListModel {
id: inputFileModel
}
delegate: Item {
Row {
id: row1
Text {
text: name
}
}
}
DropArea {
anchors.fill: parent
onDropped: {
drop.urls.forEach( function (url) {
backend.addToPaths(url)
});
}
}
}
我猜这是 PySide2 的错误?我注意到有人用 PySide2 标签替换了 Pyside 标签,我什至没有显示 python 代码来澄清我使用的是那个版本,所以我想知道这是否意味着问题只在PySide2,所以我从那个切换到 PySide6,它工作了。我不知道是什么原因造成的,但我想现在没问题了。