为视图创建多个 QSortFilterProxyModel 实例

Posted

技术标签:

【中文标题】为视图创建多个 QSortFilterProxyModel 实例【英文标题】:Create multiple instances of QSortFilterProxyModel for view 【发布时间】:2020-08-07 12:10:38 【问题描述】:

我在一个 Page 组件上有两个 listviews。两者的模型都来自一个QSortFilterProxyModel。问题是如果我为一个ListView 设置数据,另一个也被更改。发生这种情况是因为模型只有一个实例。

我是否必须创建 2 个不同的 QSortFilterProxyModel 实例,还是有其他方法?

我的代码

ma​​in.cpp


int main(int argc, char *argv[])


    // Application basic initialization
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine;

    QtWebEngine::initialize();
    QQuickStyle::setStyle("Default");

    FilterModel filterModel;
    FilterList filterList;

    // Set contexts for QML
    engine.rootContext()->setContextProperty("filterModel",&filterModel);
    engine.rootContext()->setContextProperty("filterList",&filterList);


    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();


filterlist.cpp

#include "filterlist.h"

FilterList::FilterList(QObject *parent) : QSortFilterProxyModel(parent)

    setSourceModel(&m_filterListModel);


void FilterList::searchByCategory(QString filterSubCategory)


    setFilterRole(m_filterListModel.FilterListCategoryRole);
    this->setFilterCaseSensitivity(Qt::CaseInsensitive);
    this->setFilterFixedString(filterSubCategory);


mypage.qml

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.3

Page 

    id : somepageid

    Column
        Button
            id: btn1
            text: "btn a"
            onClicked: 
                filterList.searchByCategory("category a")
            
        

        Button
            id: btn2
            text: "btn b"
            onClicked: 
                filterList.searchByCategory("category b")
            
        
    

    ListView
        id: lv1
        model: filterList
        height: 100
        delegate: Row
            Text
                text: name
            
        
    

    ListView
        id: lv2
        anchors.top: lv1.bottom
        model: filterList
        height: 100
        delegate: Row
            Text
                text: name
            
        
    



【问题讨论】:

你必须创建 2 个代理 【参考方案1】:

我是否必须创建 2 个不同的实例 QSortFilterProxyModel 还是有其他方法?

即使您创建了 2 个代理模型实例,如果为两者设置相同的源,您也会遇到同样的问题。当您调用QSortFilterProxyModel::setSource 时,它会将代理模型连接到源模型,并且您更改的所有内容都将传播到源模型。因此,如果您更改第一个代理模型中的某些内容,它将传播到源模型并从源模型传播到第二个代理模型。

文档引用QSortFilterProxyModel:

通过 QSortFilterProxyModel 所做的任何更改都将应用于原始模型。

因此,为了有 2 个具有最初相同模型的独立列表,您必须创建 2 个源模型实例和 2 个代理模型实例。

【讨论】:

以上是关于为视图创建多个 QSortFilterProxyModel 实例的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个视图上创建多个视图

Django 创建多个 URL,为 POST 和 GET 调用相同的视图

IOS 堆栈视图 - 多个水平文本字段

如何在 Firebase 中将多个 Recyclerview 设置为单个适配器(多视图类型)?

如何从多个表的多行创建视图?

为一个控制器创建多个路由