Qt 为视图创建QSortFilterProxyModel的多个实例
我在一个Qt 为视图创建QSortFilterProxyModel的多个实例,qt,listview,qml,qsortfilterproxymodel,Qt,Listview,Qml,Qsortfilterproxymodel,我在一个页面上有两个列表视图。两者的模型都来自一个QSortFilterProxyModel。问题是,如果我为一个ListView设置数据,另一个也会更改。当模型只有一个实例时,就会发生这种情况 我必须创建两个不同的QSortFilterProxyModel实例,还是有其他方法? 我的代码 main.cpp int main(int argc, char *argv[]) { // Application basic initialization QCoreApplicati
页面上有两个列表视图
。两者的模型都来自一个QSortFilterProxyModel
。问题是,如果我为一个ListView
设置数据,另一个也会更改。当模型只有一个实例时,就会发生这种情况
我必须创建两个不同的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();
}
#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);
}
过滤器列表.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();
}
#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
}
}
}
}
我是否必须创建两个不同的
QSortFilterProxyModel还是有其他方法
即使创建两个代理模型实例,如果为这两个模型设置相同的源,也会遇到相同的问题。当您调用QSortFilterProxyModel::setSource
时,它将代理模型连接到源模型,您所更改的所有内容都将传播到源模型。所以,若您在第一个代理模型中更改了某些内容,它将传播到源模型,并从源模型传播到第二个代理模型
文献引证:
通过QSortFilterProxy模型所做的任何更改都将应用于原始模型
因此,为了有两个初始模型相同的独立列表,您必须创建源模型的两个实例和代理模型的两个实例。您必须创建两个代理模型