Создайте несколько экземпляров QSortFilterProxyModel для просмотра - PullRequest
1 голос
/ 07 августа 2020

У меня два listviews на одном компоненте Page. Модель для обоих идет от единственного QSortFilterProxyModel. Проблема в том, что если я установил данные для одного ListView, другой тоже изменится. Это происходит, поскольку существует единственный экземпляр модели.

Придется ли мне создать 2 разных экземпляра QSortFilterProxyModel или есть другой способ?

Мой код

основной. 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();
}

список фильтров. 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
            }
        }
    }

}

1 Ответ

1 голос
/ 13 августа 2020

Придется ли мне создать 2 разных экземпляра QSortFilterProxyModel или есть другой способ?

Даже если вы создадите 2 экземпляра прокси-моделей, вы столкнетесь с той же проблемой если вы установите один и тот же источник для обоих. Когда вы вызываете QSortFilterProxyModel::setSource, он подключает прокси-модель к исходной модели, и все, что вы изменяете, будет распространено на исходную модель. Таким образом, если вы что-то измените в 1-й модели прокси, она будет распространяться на исходную модель и из исходной модели на 2-ю прокси-модель. изменения, сделанные с помощью QSortFilterProxyModel, применяются к исходной модели.

Итак, чтобы иметь 2 независимых списка с изначально одинаковыми моделями, вам необходимо создать 2 экземпляра исходной модели и 2 экземпляра прокси модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...