为视图创建多个 QSortFilterProxyModel 实例
Posted
技术标签:
【中文标题】为视图创建多个 QSortFilterProxyModel 实例【英文标题】:Create multiple instances of QSortFilterProxyModel for view 【发布时间】:2020-08-07 12:10:38 【问题描述】:我在一个 Page
组件上有两个 listviews
。两者的模型都来自一个QSortFilterProxyModel
。问题是如果我为一个ListView
设置数据,另一个也被更改。发生这种情况是因为模型只有一个实例。
我是否必须创建 2 个不同的 QSortFilterProxyModel
实例,还是有其他方法?
我的代码
main.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 调用相同的视图