Вы можете реализовать метод publi c в своей пользовательской модели прокси, который вы используете для включения / отключения фильтра. В моем примере кода я использую макрос Q_INVOKABLE , чтобы сделать также enableFilter()
вызываемым из QML. Таким образом, вы можете включить фильтр при нажатии кнопки, вызвав метод.
class ExampleFilterProxyModel : public QSortFilterProxyModel
{
Q_OBJECT
public:
explicit ExampleFilterProxyModel(QObject *parent = nullptr) : QSortFilterProxyModel(parent) {}
Q_INVOKABLE void setFilter(const QString & pattern) {
QRegularExpression re(pattern, QRegularExpression::CaseInsensitiveOption);
if (re.isValid()) {
QSortFilterProxyModel::setFilterRegularExpression(pattern);
}
invalidateFilter();
}
Q_INVOKABLE void enableFilter(bool enabled) {
m_enabled = enabled;
invalidateFilter();
}
protected:
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override {
if (m_enabled) {
QModelIndex index = sourceModel()->index(sourceRow, filterKeyColumn(), sourceParent);
QString str = sourceModel()->data(index, filterRole()).toString();
return str.contains(filterRegularExpression());
}
return true;
}
private:
bool m_enabled = false;
};
Когда вы создаете экземпляр модели, если явно не вызываете enableFilter со значением true, метод filterAcceptsRow()
вернет значение true для всех строки.
myFilterProxyModel->setFilterRole(MyListModel::ExampleRole);
myFilterProxyModel->setFilter("^fullstringmatch$");
myFilterProxyModel->setSourceModel(myModel);
//myFilterProxyModel->enableFilter(true);
Если вы используете QML, то вы делаете пользовательскую модель прокси видимой для контекста QML, например, устанавливая ее как свойство контекста (например, filterProxyModel), и включаете фильтр, вызывая
filterProxyModel.enableFilter(true)