QML 阻止 ListView 委托一直更新
QML prevent ListView delegate to update all the time
我是 QML/QtQuick 的新手,仍在学习中。我在一个非常小的私人项目中遇到了一些性能问题。我只是尝试为我的 ListView 实现一个过滤器功能,因为 >15.000 个对象需要手动搜索很多。我只想在完成搜索字段的编辑或按“return”后更新 ListView。但是每次我从这个文本字段中插入或删除一个字符时它都会刷新,有时需要几秒钟。
有人知道如何防止列表永久刷新或减少这些性能问题吗?
非常感谢
import QtQuick 2.12
import QtQuick.Controls 2.5
import QtQuick.XmlListModel 2.12
import Anime_initialiser 1.0
import "."
Page {
TextField{
id: searchField
width: parent.width
z: 1
/*onEditingFinished: {
XL.animeListModel.reload()
}*/
}
ListView {
z: 0
ScrollBar.vertical: ScrollBar { active: true }
id: listView
width: parent.width
height: parent.height
model: XL.animeListModel
y: searchField.height
Anime_initialiser {
id: initialiser
onShowAnimeDetails: {
xmlDataString = xmlString
swipeView.currentIndex = swipeView.currentIndex+1
}
}
delegate: ItemDelegate {
visible: {
if (searchField.length > 0)
return (main_title.toLowerCase().match(searchField.text.toLowerCase()) || de_title.toLowerCase().match(searchField.text.toLowerCase())) ? true : false
else
return true
}
height: visible ? Button.height : 0
width: parent ? parent.width : 0
Button {
anchors.fill: parent
onClicked: {
anime_id = aid
initialiser.buttonClicked(anime_id)
}
Text {
width: parent.width
height: parent.height
font.pointSize: 100
minimumPointSize: 12
fontSizeMode: Text.Fit
text: aid + ": " + main_title + (de_title ? "\nDE: " + de_title : "")
}
}
}
}
}
与其切换所有代表的可见标志,不如使用 QSortFilterProxyModel。这个想法是代理模型将使用您的 XL.animeListModel
作为源模型,然后您可以为代理提供一个正则表达式,告诉它要过滤掉哪些。根据您希望它如何过滤,您可以只调用 setFilterRole()
告诉它哪个 属性 与您的正则表达式进行比较,或者您可以通过覆盖 filterAcceptsRow()
函数来执行自定义过滤器。
编辑:
如果您不想使用代理,您仍然可以通过不在 visible
属性 上直接绑定到搜索字段来防止持续更新。您的 onEditingFinished
代码走在正确的轨道上。您可以创建一个单独的文本字符串,仅包含完整的搜索文本。
property string searchText: ""
然后在输入完搜索文本后更新该字符串。
onEditingFinished: {
searchText = searchField.text.toLowerCase();
}
最后,将您的 visible
属性 绑定到这个新字符串。
visible: {
if (searchText.length > 0)
return (main_title.toLowerCase().match(searchText) || de_title.toLowerCase().match(searchText)) ? true : false
else
return true
}
我是 QML/QtQuick 的新手,仍在学习中。我在一个非常小的私人项目中遇到了一些性能问题。我只是尝试为我的 ListView 实现一个过滤器功能,因为 >15.000 个对象需要手动搜索很多。我只想在完成搜索字段的编辑或按“return”后更新 ListView。但是每次我从这个文本字段中插入或删除一个字符时它都会刷新,有时需要几秒钟。
有人知道如何防止列表永久刷新或减少这些性能问题吗?
非常感谢
import QtQuick 2.12
import QtQuick.Controls 2.5
import QtQuick.XmlListModel 2.12
import Anime_initialiser 1.0
import "."
Page {
TextField{
id: searchField
width: parent.width
z: 1
/*onEditingFinished: {
XL.animeListModel.reload()
}*/
}
ListView {
z: 0
ScrollBar.vertical: ScrollBar { active: true }
id: listView
width: parent.width
height: parent.height
model: XL.animeListModel
y: searchField.height
Anime_initialiser {
id: initialiser
onShowAnimeDetails: {
xmlDataString = xmlString
swipeView.currentIndex = swipeView.currentIndex+1
}
}
delegate: ItemDelegate {
visible: {
if (searchField.length > 0)
return (main_title.toLowerCase().match(searchField.text.toLowerCase()) || de_title.toLowerCase().match(searchField.text.toLowerCase())) ? true : false
else
return true
}
height: visible ? Button.height : 0
width: parent ? parent.width : 0
Button {
anchors.fill: parent
onClicked: {
anime_id = aid
initialiser.buttonClicked(anime_id)
}
Text {
width: parent.width
height: parent.height
font.pointSize: 100
minimumPointSize: 12
fontSizeMode: Text.Fit
text: aid + ": " + main_title + (de_title ? "\nDE: " + de_title : "")
}
}
}
}
}
与其切换所有代表的可见标志,不如使用 QSortFilterProxyModel。这个想法是代理模型将使用您的 XL.animeListModel
作为源模型,然后您可以为代理提供一个正则表达式,告诉它要过滤掉哪些。根据您希望它如何过滤,您可以只调用 setFilterRole()
告诉它哪个 属性 与您的正则表达式进行比较,或者您可以通过覆盖 filterAcceptsRow()
函数来执行自定义过滤器。
编辑:
如果您不想使用代理,您仍然可以通过不在 visible
属性 上直接绑定到搜索字段来防止持续更新。您的 onEditingFinished
代码走在正确的轨道上。您可以创建一个单独的文本字符串,仅包含完整的搜索文本。
property string searchText: ""
然后在输入完搜索文本后更新该字符串。
onEditingFinished: {
searchText = searchField.text.toLowerCase();
}
最后,将您的 visible
属性 绑定到这个新字符串。
visible: {
if (searchText.length > 0)
return (main_title.toLowerCase().match(searchText) || de_title.toLowerCase().match(searchText)) ? true : false
else
return true
}