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
            }